2.1 BIT类型
BIT [(M)]:位类型,M表示指定位数(1-64),如果M被忽略(默认值)是1
查看tt1里面的内容时发现a的内容10没有出现,这是为什么呢?
因为BIT字段在显示时是按照ASCLL码对应的值显示的!!!
数字10对应的ASCII码正好是个空格,所以什么都没有看见。
当我们接着往tt1表中插入(65, 65)时,因为A的ASCII值是65,所以a的值就是A了!
如果我们有这样的值,只存放0或1,这时可以定义bit(1),这样可以节省空间。
我们可以看到插入2时越界报错了。
往 tt3 里面插入128时出现错误:Out of range value for column ‘num’ at row 1(数值越
界),而插入127时则是成功的。
说明:在MySQL中,整型可以指定是有符号的和无符号的,默认是有符号的可以通过
UNSIGNED来说明某个字段是无符号的。
无符号案例:
往 tt4 里面插入256时出现错误:Out of range value for column ‘num’ at row 1(数值越
界),而插入128和255时则是成功的,这就体现了unsigned是无符号的,范围比有符号
的要大。
注意:尽量不使用UNSIGNED,对于INT类型可能存放不下的数据,INT UNSIGNED同
样可能存放不下,与其如此,还不如设计时,将INT类型提升为BIGINT类型!!!
其他类型大家可自行推导。
2.3 小数类型
2.3.1 FLOAT
FLOAT[(M, D)] [UNSIGNED]:M指定显示长度,D指定小数位数,占用空间4个字节
当我们的FLOAT(4,2)如果是一个有符号的,则表示范围是-99.99 ~ 99.99,如果小数位
数多于2位,则会四舍五入!
如果定义的是FLOAT(4,2) UNSIGNED这时,因为把它指定为无符号的数,范围是 0 ~
2.3.2 DECIMAL
DECLMAL(M, D) [UNSIGNED]:定点数M指定长度,D表示小数点的位数DECIMAL和
FLOAT很像,但是有区别:FLOAT和DECIMAL表示的精度不一样,FLOAT能表示的精
度大约是7位,DECIMAL(M, D)中的M最大为65,D最大为30,如果M忽略默认是10,
如果D忽略默认是0。
建议:如果希望小数的精度高,推荐使用DECIMAL!
3. 字符串类型
3.1 CHAR
CHAR(L):固定长度字符串,L是可以存储的长度,单位为字符,占用空间1个字节
说明:char(2) 表示可以存放两个字符,可以是字母或汉字,但是不能超过2个, 最多只
VARCHAR(L):可变长度字符串,L表示字符个数,最大长度(4个字节)65535个字节
说明:关于VARCHAR(L),L表示的是字符数,这个数到底能有多大,这个L值,和表的
编码密切相关:
① VARCHAR长度可以指定为0到65535之间的值,但是有1 - 3 个字节用于记录数据大
小,所以说有效字节数是65532。
② 当表的编码是utf8时,VARCHAR(L)的参数L最大值是65532/3=21844,因为utf8中一
个字符占用3个字节;如果编码是gbk,VARCHAR(L)的参数n最大是65532/2=32766,
因为gbk中一个字符占用2字节。
3.3 CHAR和VARCHAR比较
如何选择定长或变长字符串?
① 如果数据确定长度都一样,就使用定长(CHAR),比如:身份证号,手机号,md5
② 如果数据长度有变化,就使用变长(VARCHAR), 比如:名字,地址,但是得能保证
最长的能存的进去
③ 定长的磁盘空间比较浪费,但是效率高;变长的磁盘空间比较节省,但是效率低
4. 日期和时间
常用的日期有如下三个:
① DATETIME:时间日期格式 ‘yyyy-mm-dd HH:ii:ss’ ,表示范围从1000到9999,占用
8个字节
② DATE:日期 ‘yyyy-mm-dd’,占用3个字节
③ TIMESTAMP:时间戳,从1970年开始的 ‘yyyy-mm-dd HH:ii:ss’,格式和DATETIME
完全一致,占用4个字节
添加时间时,时间戳自动补上当前时间!!!
更新时间时,时间戳会变成当前时间!!!
5. ENUM和SET
5.1 ENUM
ENUM:枚举,“单选”类型;
ENUM(‘选项1’, ‘选项2’, ‘选项3’, …);
该设定只是提供了若干个选项的值,最终一个单元格中,实际只存储了其中一个值;而
且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如
下数字:1,2,3,…最多65535个;当我们添加枚举值时,也可以添加对应的数字编号
5.2 SET
SET:集合,“多选”类型;
SET(‘选项值1’, ‘选项值2’, ‘选项值3’, …);
该设定只是提供了若干个选项的值,最终一个单元格中,实际存储了其中任意多个值;
而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应
如下数字:1,2,4,8,16,32,… 最多64个
说明:不建议在添加枚举值和集合值的时候采用数字的方式,因为不利于阅读
案例:有一个调查表votes,需要调查人的喜好, 比如(登山,游泳,篮球,武术)中