数据类型 | 说明 |
---|---|
bit(M) | 位类型。M指定位数,默认值为1,范围1-64. |
tinyint [unsigned] | 带符号范围:-128 - 127,无符号范围: 0 - 255 |
bool | 使用0和1表示假和真 |
smallint [unsigned] | 带符号范围:-2^15 - 2^15 - 1,无符号范围:0 - 2^16 - 1 |
mediumint [unsigned] | 带符号范围:-2^23 - 2^23 - 1,无符号范围:0 - 2^24 - 1 |
int [unsigned] | 带符号范围:-2^31 - 2^31 -1,无符号范围:0 - 2^32 - 1 |
double [unsigned] | 带符号范围: -2^63 - 2^63 - 1,无符号范围: 0 - 2^64 - 1 |
float[(M,D)] [unsigned] | M表示显示长度,D表示小数点的位数,占用4字节 |
double[(M,D)] [unsigned] | 精度比float更高的浮点数,占用8字节 |
decimal[(M,D)] [unsigned] | M指定长度,D表示显示小数的位数 |
bit[M]:M表示使用的比特位数,范围为1-64,bit位在显示的时候是按照Ascll码来显示的。
insert into t1 values(10);
insert into t1 values(11);
insert into t1 values(12);
可以看到插入的三个数据是显示不出来的,那是因为Ascll值为10 11 12的字符为不可显字符。插入48那么显示出来就为‘0’;
tinyint占用1个字节,对于有符号而言取值范围是-128 - 127。无符号的范围是0 - 255。当用户在插入数据超出其所表示的范围后会拦截我们插入。
insert into t2 values(127,255);
insert into t2 values(-128,255);
mysql会对非法数据进行拦截
insert into t2 values(128,0);
float[(M,D)], M:显示长度,D:指定小数位数。
insert into t3 values(-99.99);
insert into t3 values(99.99);
insert into t3 values(99.994);
insert into t3 values(-99.994);
decimal的用法与float一样,与float的区别是decimal比float更加精确。
insert into t4 values(14.1234567,14.1234567);
float的精度大约是7位,对于decimal而言,支持的最大整数位数65位,支持的最大小数位数30位。decimal(M,D)默认情况下M的值为10,D的值为0。
float和double是采用标准的浮点数存储形式,decimal实际存储的是字符串。
数据类型 | 说明 |
---|---|
char(size) | 固定长度字符串,size的最大值为255 |
varchar(size) | 可变长度字符串,最大长度为65535字节 |
blob | 二进制数据 |
text | 大文本,不支持全文索引,不支持默认值 |
char(size):size的最大值为255,表示char字符串最多存储255个字符(注意是字符不是字节)
insert into t5 values('ab');
insert into t5 values('张三');//utf8编码规则下一个中文字符占用3个字节
varchar(size)是变长字符串,当实际字符串长度小于size时,那么占用的空间以实际varchar长度为准。注意:这里的size指的是字节
varchar和char该如何选择呢?
1.当存储一些定长的数据的时候,例如身份证号,手机号,学号等等,最好使用定长字符串。
2.当存储的数据长度不定的时候,例如名字,家庭住址,商品名称等等,最好使用变长字符串。
3.定长字符串IO效率高。
4.变长字符串IO效率低。
例如,在持久化存储的时候,通常都要对结构化数据进行序列化,将序列化后的数据进行持久化存储,序列化的工具有很多,Json,protobuf等等,使用protobuf序列化的结果就是二进制数据,此时就可以使用blob数据类型来存储。
当存储一些大的文本数据时,就可以使用text数据类型,text数据类型不支持全文索引,不支持默认值。
常用的时间类型有以下三种:
注意: 时间戳形式的数据在插入时不用显示的插入数据,系统会自动填入此时的时间戳,并且在进行更新数据时,时间戳数据也会自动更新。
insert into t7(birthday,time) values('2000-01-01','2000-01-01 15:15:15');
update t7 set time='2020-10-01 09:00:00';
enum类型,多选一,在实际存储的时候只会存储众多选项中的 某一个值。而处于效率考虑,这些值实际存储时存储的是‘数字’,枚举常量中的每个值对应 1…,最大到65535个,所用插入枚举值的时候,不仅可以使用枚举值也可以使用其对应的数字。
例如,在表示性别的时候,就可以使用enum类型。
create table t8 ( sex enum('男','女') );
insert into t8 values('男');
insert into t8 values(1);
set类型,支持多选一,多选多,当然也可以不选填入NULL值。同样,实际集合类型存储的也是‘数字’,集合中的每个选项对应1,2,4,8…,最多64个。可以理解为每个二进制位对应一个选项。在插入时同样可以使用数字。(无论枚举还是集合,不建议使用数字的形式,不易阅读)。
例如,描述一个人爱好的时候,就可以使用集合类型,比如一个人的爱好有抽烟,喝酒,烫头。
create table t10 ( id int, hobby set('跑步','游泳','篮球','足球','排球','骑行'));
insert into t10 values(1,'篮球,跑步,游泳'),(2,'篮球,排球,足球'),(3,'骑行,跑步,足球,游泳'),(4,'游泳');
7 = 1 + 2 + 4 :表示爱好为跑步,游泳,篮球的人。
面临的问题:例如,我们想查询出爱好有篮球的人,使用hobby=‘篮球’是不对的(这个意思是爱好只有篮球的人),可以借助find_in_set(sub,list)函数来完成。如果sub在list中返回其下标(从1开始),不在就返回0。
select * from t10 where find_in_set('篮球',hobby);
选出爱好有骑行或者有游泳的人。
select * from t10 where find_in_set('骑行',hobby) or find_in_set('游泳',hobby);