
●决定了数据的取值范围。

整型以tinyint为例




下面是无符号tinyint范围测试



num(列名) tinyint(类型)
bit[(M)] : 位字段类型。M表示每个值的位数,范围从1到64。如果M被忽略,默认为1







float[(m, d)] [unsigned] : M指定显示长度,d指定小数位数,占用空间4个字节





decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数
●decimal(5,2) unsigned 表示的范围 0 ~ 999.99
●这点与float是一样的
decimal和float很像,但是有区别:float和decimal表示的精度不一样
测试精度
创建一个表,表当中分别包含一个float(10,8)的列和一个decimal(10,8)的列
向表当中插入数据,查表结果float则会存在一定的精度损失,decimal则没有
●float表示的精度大约是7位
●decimal整数最大位数m为65。支持小数最大位数d是30。如果d被省略,默认为0.如果m被省略, 默认是10(可能会受到MySQL版本影响)
decimal的精度更准确,因此如果我们希望某个数据表示高精度,可以选择decimal
char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255


varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节


●当我们的表的编码是utf8时,varchar(n)的参数n最大值是65532/3=21844(因为 utf8 中,一个字符占用3个字节)
●如果编码是gbk,varchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符 占用2字节)
●char(L)定义后,无论存储的字符串长度是否到达L,都会开辟用于存储L个字符的定长空间,如果存储的字符串长度超过L则会报错。
●varchar(L)定义后,会根据存储字符串的长度按需开辟空间,并且需要使用1-3字节的空间用于表示存储字符串的长度以及其他控制信息,如果存储的字符串长度超过L则会报错。
以utf8编码为例:
如何选择定长(char)或变长字符串(varchar)?
●如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号,md5
●如果数据长度有变化,就使用变长(varchar), 比如:名字,地址,但是你要保证最长的能存的进去。
●定长的磁盘空间比较浪费,但是效率高。
●变长的磁盘空间比较节省,但是效率低。
●定长的意义是,直接开辟好对应的空间
●变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少
●datetime 时间日期格式yyyy-mm-dd HH:ii:ss表示范围从1000 到 9999,占用八字节
●timestamp:时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用四字节
创建一个表,表当中包含date、datetime和timestamp三种时间日期类型的列
查看表结构可以看到,timestamp类型的t3列是不允许为空的,它的默认值为CURRENT_TIMESTAMP
如果向表中插入数据,t3会自动更新到最新时间(无需手动插入)
向表中插入值
更新数据,时间戳会更新

enum('选项1','选项2','选项3',...);
●出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,3,....,最多65535个;当我们添加枚举值时,也可以添加对应的数字编号
set:集合,“多选”类型:
set('选项值1','选项值2','选项值3', ...);
●出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,4,8,16,32,....,最多64个
注意:不建议在添加枚举值,集合值的时候采用数字的方式,因为不利于阅读
例子
创建一个调查表,表当中包含被调查人的姓名、性别(只选一个)和爱好(多个)
向表中插入记录时,被调查人的性别只能从男和女中进行二选一,被调查人的爱好可以从提供的若干个选项中进行多选一或多选多,多个爱好之间需要通过英文逗号隔开
可以通过数字设置enum
数字是从1开始,有几个值数字最大就是几,例如enum(‘男’, ‘女’),数字1代表男,数字2代表女,最大就是2,超过了范围则不允许插入
根本原因在于,MySQL出于效率考虑,这些值(比如男,女)实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,3,....,最多65535个
可以通过数字设置set
在插入记录时,除了通过指明多个选项来设置爱好,还可以通过数字的方式来设置
使用数字插入并不是使用下标,使用的是位图的方式进行插入
例如:
'羽毛球','游泳','篮球','写代码' // 4个爱好
用比特位表示:0000
0001 (1)是羽毛球
0010 (2)是游泳
0011 (3)是羽毛球,游泳
0100 (4)是篮球
依次类推
1111 (15)则是'羽毛球','游泳','篮球','写代码'



注:虽然enum和set可以通过数字的方式进行设置,但严重不推荐这种做法,因为这样的SQL可读性太差
enum和set查找
如果想要筛选出调查表中的所有女的或男的,那么直接在筛选时指明gender='女'或者gender='男'即可
但如果要筛选出调查表中爱好包含游泳的就不能使用where了,这并不是我们想要的结果
集合查询使用find_ in_ set函数:
find_in_set(sub,str_list) :如果 sub 在 str_list 中,则返回下标;如果不在,返回0;
str_list字符串是用逗号分隔的字符串
免责申明:
本文系转载,版权归原作者所有,如若侵权请联系我们进行删除!
《数据治理行业实践白皮书》下载地址:https://fs80.cn/4w2atu
《数栈V6.0产品白皮书》下载地址:https://fs80.cn/cw0iw1
想了解或咨询更多有关袋鼠云大数据产品、行业解决方案、客户案例的朋友,浏览袋鼠云官网:https://www.dtstack.com/?src=bbs
同时,欢迎对大数据开源项目有兴趣的同学加入「袋鼠云开源框架钉钉技术群」,交流最新开源技术信息,群号码:30537511,项目地址:https://github.com/DTStack