字符串类型:
char(n) 定长字符串, n 值用于表示所允许的最大长度,取值范围 0-255
① 长度限制不区分中英文,表示是允许最多存储多少个字符
② 使用length 函数获取的是字节数,不是字符数。在 utf-8 编码种一个汉字占用 3 个字节
mysql> create table c2(id char(5));
Query OK, 0 rows affected (0.03 sec)
mysql> insert into c2 values("yan");
Query OK, 1 row affected (0.01 sec)
mysql> insert into c2 values("张三是好人");
Query OK, 1 row affected (0.01 sec)
mysql> insert into c2 values("张三是好人1");
ERROR 1406 (22001): Data too long for column 'id' at row 1
varchar(n) 可变长度的字符串, n 值取值范围为 0-65535
实际存储多少个字符就占多少个位置,每个列所占用的长度根据具体内容变化
create table t1(id varchar(20));
char 和 varchar
①char属于定长, varchar 属于变长。选择最基本的依据就是定长使用 char ,变长使用 varchar
② char允许的最大长度为 255 , varchar 允许的最大长度为 65535
③如果存储的字符串长度变化不大,推荐优先考虑使用char,例如针对口令进行md5 加密,固定长度的行不容易产生碎片;对于长度很短的列,char 的性能优于 varchar ,是因为 varchar 需要引入额外一个或者两个字节存储字符串长度
④char在计算种会自动去除空格;varchar不会去掉空格,但是进行字符串比较时,会去除空格后进行比较;在插入数据时系统会自动去除字符串默认多余的空格
大对象类型 Lob:
大对象类型可以分为2大类:文本类型和二进制类型
① BLOB是一个二进制大对象,可以容纳可变长度的数据,其中分为 tinyblob 、 blob 、
mediumblob 、 longblob 。一般用于存储二进制数据,例如声音、图像、视频等
② Text是一个文本大对象,可以容纳可变长度的数据,其中分为tinytext 、 text 、 mediumtext、 longtext,一般用于存储文本类型数据,例如小说、商品简介
mysql> create table c9(id text);
Query OK, 0 rows affected (0.02 sec)
mysql> create table c8(id blob);
Query OK, 0 rows affected (0.02 sec)
mysql> insert into c9 values("Abc");
Query OK, 1 row affected (0.01 sec)
mysql> insert into c8 values("Abc");
Query OK, 1 row affected (0.01 sec)
mysql> select * from c9 where id='abc';
+------+
| id |
+------+
| Abc |
+------+
1 row in set (0.00 sec)
mysql> select * from c8 where id='abc';
Empty set (0.00 sec)
两者之间的区别:
blob是二进制类型,可以容纳可变长度的数据,区分大小写; text 是一个不区分大小写的 blob
类型名称 | 允许的最大长度 | 说明 |
tinytext | 0-255 | 短文本字符串 |
text | 0-65535 | 长文本字符串 |
mediumtext | 16M | 中等长度的长文本字符串 |
longtext | 4G | 极大文本数据 |
tinyblob | 0-255 | 不超过255个长的二进制串 |
blob | 0-65535 | 二进制类型的长文本字符串 |
mediumblob | 16M | 中等长度的二进制长文本字符串 |
longblob | 4G | 极大二进制数据 |
日期时间类型 :
create table dt1(id date);
insert into dt1 values('1989-2-3');
特殊的时间是时间戳类型
create table dt2(id timestamp default current_timestamp,name varchar(20));
mysql> insert into dt3(name) values('yan1');
Query OK, 1 row affected (0.01 sec)
mysql> select * from dt3;
+---------------------+------+
| id | name |
+---------------------+------+
| 2022-04-17 15:07:33 | yan1 |
+---------------------+------+
1 row in set (0.00 sec)
系统函数 now() 可以获取系统的当前时间
select now();
日期类型说明:
类型名称 | 说明 | 格式 |
date | 日期类型,有效范围为1000-9999年,不包含时分秒 | 3B,yyyy-MM-dd |
time |
时间类型,有效范围为 -838 到 838 小时范围内,一般用于表示时间值或者持续时间。不包含年月日 | 3B,HH:mm:ss |
year | 年份类型,有效范围1901到2155年 | 1B,yyyy |
datetime |
日期时间类型,其中包含日期和时间,可以精确到秒,有 效范围为 1000 到 9999 年。具体存储时和时区无关 |
8B , yyyy-MM-dd HH:mm:ss |
timstamp |
时间戳类型,可以精确到秒,有效分为是 1970 到 2038 年, 同时支持自动存储修改的时间,和当前时区相关 | 4B,yyyyMMddhhmmss |
集合和枚举类型
set集合类型,可以设置多个集合成员,允许从多个集合成员种选择多个数据进行插入
create table set1(id int,hobby set('抽烟','喝酒','烫头'));
insert into set1 values(1,'烫头,抽烟'); -- 没问题
insert into set1 values(1,'烫头,抽烟,扣脚'); -- 报错,因为其中一个值不在set定义种
insert into set1 values(1,'抽烟,抽烟');-- 实际上只插入一个值,也就是会自动去除重复值
位类型
bit(1)表示可以存储一个二进制位,只能存储 0 或者 1 ,其中 n 的最大上限值为 64
bit(8)表示可以存储 8 个二进制位的值,取值范围为 0 到 255
总结:
①定义数据类型就是定义列,数据类型决定数据的特性【域完整性】
②数据类型主要分为字符串类型、定点数和浮点数类型、日期类型、大对象类型【慎用】
③数据类型在不同的存储引擎上表现不同
④数据所采用的数据类型是根据业务需求和对应的数据类型特征进行选择,不建议使用过于复杂的数据类型