MySQL的数据类型包括整数类型、浮点数类型、定点数类型、日期和时间类型、字符串类型和二进制数据类型。不同数据类型决定了数据的存储格式、有效范围和相应的限制。
MySQL支持的整数类型如下表所示
MySQL支持数据类型的名称后面指定该类型的显示宽度,基本形式如下:
数据类型(显示宽度)
显示宽度指能够显示的最大数据的长度。在不指定宽度的情况下,整数类型的默认显示宽度与其有符号数的最大值的显示宽度相同。如INT型为11,BIGINT型为20。
但实际上,即使出入的数据的宽度大于了设置的显示宽度,但只要小于等于默认宽度,就可以正常完整的显示出来。
浮点数类型和定点数类型用来表示小数。包括以下类型
其中,定点数类型的M指精度,是数据的总长度。小数点并不占位置,D为标度,指小数点后的长度。当插入数据的精度高于实际定义的精度时,系统会自动进行四舍五入处理。浮点数类型FLOAT和DOUBLE在四舍五入时不会报错,但定点数类型DECIMAL会有警告。
当未指定精度时,DECIMAL型会默认整数位为10,小数位为0,即默认为整数。
由于定点数在MySQL中是以字符串形式存储的,其精度比浮点数高,而且浮点数会出现误差,在对数据精度要求高的情况下,选择DECIMAL比较安全。
当插入的数据值超过了该类型的取值范围时,系统会报错,并将相应的零值插入到数据库中。
向Year类型插入数据时可以直接用数字也可以用字符串,对于低于4位的会自动转换,如输入32,‘78’,3,‘2’会分别转换为2032,1978,2003和2002。
注意‘0’和‘00’都会转换为2000,而0会转化为0000。
Time类型的数据赋值方式如下
‘D HH:MM:SS’格式的字符串,或者’HHMMSS’格式的字符串或者HHMMSS格式的数值,其中D表示天数,取值范围为0~34,保存时会自动将D转换到HH处,如输入‘2 11:32:21’会转换为’59:32:21’,当然输入不必严格遵守上述格式,系统会自动转换,具体规则可以自己尝试。如’2 20’,’2 20:20’,’30’和’345454’会转换为’68:00:00’,’68:20:00’,’00:00:30’和’34:54:54’。即基本符合从左向右分配。
当HH和SS的赋值大于60时,即此值无效,系统会报错,并将其转换为00:00:00。在输入数据合法但超出Time值范围时,会被裁为范围内最接近的端点,如’880:00:00’会转换为’838:59:59’。
可以适用CURRENT_TIME和NOW()出入当前系统时间。
可以适用’YYYY-MM-DD’或’YYYYMMDD’格式的字符串、’YY-MM-DD’或’YYMMDD’格式的字符串、YYYYMMDD或YYMMDD格式的数字表示。
同样可以使用CURRENT_DATE或者NOW()来输入当前系统日期。
DATATIME类型相当于DATE类型和TIME类型的组合。
当某字段的数据类型为DATETIME时,使用NOW()可以输入当前系统日期和时间。
与DATETIME类型相同点:
- 显示格式相同
- 复制方法相同
- 用NOW()转为换系统当前时间
与DATETIME类型不同点:
- 比DATETIME类型范围小
- 使用CURRENT_TIMESTAMP来输入系统当前日期和时间
- 输入NULL或无任何输入时,系统自动输入系统当前日期和时间
- 该类型能够根据不同的地区的时区来转换时间
字符串类型包括CHAR、VARCHAR、BLOB、TEXT、ENUM和SET。
两者都是在创建表时就指定了最大长度,基本形式如下
字符串类型(M)
注意CHAR类型的长度是固定的,永远是指定的M,其值可以是0~255的任意值。
而VARCHAR类型的长度是可变的,创建时指定的M只是最大长度,可以取0~65535之间任意值。即在最大值M范围内使用多少分配多少,实际占用空间为字符串的实际长度加1,此1为字符串的结束标志符。因此会保存输入字符串最后的空格,而前者不会。
当出入的字符串长度大于可插入最大值时,系统会阻止插入并报错。
虽然VARCHAR比CHAR占用空间小、更灵活,但处理速度却比不上CHAR型,所以对于长度变化不大和查询速度要求较高的字符串类型,最好还是选择CHAR类型。
ENUM类型又称为枚举类型。在创建表时,其取值范围就以列表的形式制定了。基本形式如下
属性名 ENUM(‘值1’, ‘值2’, ···,’值n’)
其中,属性名指字段的名称,’值n’表示列表中的第n个值,这些值末尾的空格都会被系统直接删除。
ENUM类型的值只能取列表中的一个元素。取值列表中最多可以有65535个值。列表中的每个值都有一个顺序排列的编号,MySQL中存储的是这个编号而非列表中的具体值。
一般来说,如果只能选取列表中的一个值,就选择ENUM类型,如果需要选取列表中的多个值的组合,则需要选择SET类型。
同样,在创建表时,其取值范围就以列表的形式制定了。基本形式如下
属性名 SET(‘值1’, ‘值2’, ···,’值n’)
具体同ENUM类型。
在取多个元素时,不同元素之间用逗号隔开,SET类型的值最多只能是有64个元素构成的集合。同ENUM,存储的是编号而非具体值。
插入记录时,SET字段中的元素顺序无关紧要,系统会自动按照定义时的顺序显示。
如SET类型的取值类表为(‘A’,’B’,’C’,’D’,’E’),插入值为(‘B’)和(‘C,B,D’)时,结果显示为(B)和(B,C,D)。
类似于CHAR和VARCHAR类型的关系和使用方法。
对于CHAR来说,不足最大长度的空间用“\0”补全。
BIT类型也是在创建表时指定了最大长度,基本形式为
BIT(M)
如字段的类型为BIT(4),则存储的数据是从0~15。
在查询BIT类型的数据时,要用BIN(字段名+0)来将值转换为二进制显示。
此为一种特殊的二进制类型,可以用来保存数据量很大的二进制数据,如图片等。包括TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。
BLOB类型主要用来存储图片、PDF文档等二进制文件。通常来说,可以将这些文件存储在文件系统中,然后在数据库中存储这些文件的路径,这种方式比直接存储在数据库中简单,当然访问速度也会慢一些。
在MySQL中创建表时需要考虑为字段选择哪种数据类型最合适。基本注意事项可以参考上述总结。
下面是一些常见问题