数据类型约束
如果我们向mysql特定的类型中插入不合法的数据,MySQL一般都是直接拦截我们,不让我们做对应的操作。
反过来意味着,我们已经有数据成功插入到mysql了,一定插入的时候都是合法的。因此,mysql中,一般而言,数据类型本身也是一种:约束(保证数据库中数据是可预期,完整的)
倒逼程序员,让程序员尽可能进行正确的插入。
整形
在MySQL中,整型可以指定是有符号的和无符号的,默认是有符号的。可以通过UNSIGNED来说明某个字段是无符号的。
tinyint:一字节,范围-128~127,无符号范围0~255
bit[(M)] : 位字段类型。M表示每个值的位数,范围从1到64。如果M被忽略,默认为1。
bit数值不显示原因:ASCII码显示(mysql5.7),有的字符为不可显字符
解决方案:select id,hex(bit) from 表名; 查找时:转成十进制表示
mysql 8.0.43显示16进制
小数类型
float[(m, d)] [unsigned] : M指定显示长度,d指定小数位数,占用空间4个字节
- 举例:float(4, 2),范围是-99.99 ~ 99.99。
- 插入99.994,可以成功插入,因为四舍五入成了99.99
- 插入99.995,插入不了,越界。
如果是 float(4,2) unsigned ,范围是 0~99.99。
decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数
作用:比float更加精确
说明:float表示的精度大约是7位。
decimal整数最大位数m为65。支持小数最大位数d是30。如果d被省略,默认为0.如果m被省略,默认是10。
字符串类型
char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255
特别注意:长度是和编码集相关的,例如utf8mb3的字符长度是3字节,char(L),L是标识字符的上限个数。
varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节
特别注意:这个长度是指最大字节数65535,但有1~3个字节是用来存储长度的,所以有效字节数是65532举例:按照utf8mb3来表示,3字节,65532/3=21844个字符,理论上最多是可以存21844个字符。
**细节点:****mysql的行也是有长度上限的,上限也是65535。**因此如果有2列及以上,有效字节数是小于65532的。
char vs varchar
char:效率高,固定字节数,一块完整开辟
varchar:效率低,可变长度,用多少开多少,因为可变,维护成本高。
日期类型
date :日期 'yyyy-mm-dd' ,占用三字节
datetime:时间日期格式 'yyyy-mm-dd HH:ii:ss' 表示范围从 1000 到 9999 ,占用八字节
timestamp :时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用四字节特别注意:timestamp使用时,如果要插入时自动设置时间戳,要建表时设置默认值为CURRENT_TIMESTAMP,即列名 timestamp default CURRENT_TIMESTAMP。但这仅仅只在插入时起效果,如果想在更新时也起效果,需要设置:列名 timestamp default CURRENT_TIMESTAMP ++on update++ CURRENT_TIMESTAMP.
enum 和 set 类型
enum:枚举,"单选"类型;
enum('选项1','选项2','选项3',...);作用:单选一个(也可以为NULL)
插入方式:
1)直接指定选项插入
2)用数字,数字值表示的就是选项几,上限65535
set:集合,"多选"类型;
set('选项值1','选项值2','选项值3', ...);1)选项插入,例:values('选项值1,选项值2')
**2)数字插入。位图式的插入,比如插入选项1,指定1;选项2,指定2;选项3,指定4。类似:000 -> 001(选项1),000 -> 010(选项2),000 -> 110(选项2,,选项3)**选项上限为64个
说明:不建议在添加枚举值,集合值的时候采用数字的方式,因为不利于阅读。
特别地:因为集合类型可以选择多个,where字句指定选项选择的话,只能选择100%匹配的。如果想选择包含单个选项的,方法:find_in_set(sub, str_list);