MySQL数据类型
一、MySQL数据类型汇总
二、整型
-
UNSIGNED
无符号类型,无符号最小取值 0
-
ZEROFILL
0填充,如果整数指定了M位,则用 0 在左边填充。
-
如何选择
存在存储空间和可靠性的平衡问题,在实际工作中,系统故障产生的成本远远超过增加几个字段存储空间所产生的成本。
三、浮点型
-
数据精度
FLOAT(M,D) / DOUBLE(M,D) M:精度,D <= M <= 255 D:标度,小数位,0 <= D <= 30
-
精度误差
# 数学角度 0.47 + 0.44 + 0.19 = 1.1 # 在MySQL中 0.47 + 0.44 + 0.19 = 1.09999999999
-
避免使用 “=” 判断两个浮点数是否相等
四、定点数
-
高精度小数
DECIMAL(M,D) M:精度,D <= M <= 65 D:标度,小数位,0 <= D <= 30 默认值:DECIMAL(10,0)
-
精准原因
定点数在MySQL内部是以字符串的形式进行存储,故决定了它一定是精确的
-
开发经验
由于DECIMAL数据类型是精确的,在我们的项目中,除了极少数(比如商品编号)用到整数类型外,其它数据都用DECIMAL,原因是项目如果所处零售业,要求精准,一分钱也不能差
五、位类型
-
BIT类型存储二进制数
BIT(M) : 1 <= M <= 64 默认是1位。
六、日期类型
-
日期类型汇总表
-
TIME类型
向TIME类型的字段插入数据时,可以使用 下面的格式
D HH:MM:SS 0 <= D <= 34
-
TIMESTAMP
存储数据的时候需要对当前时间所在的时区进行转换,查询数据的时候再将时间转换回当前的时区。因此,使用TIMESTAMP存储的同一个时间值,在不同的时区查询时会显示不同的时间。
底层存储的是毫秒值,距离1970-1-1 00:00:00的毫秒数
# 修改时区 SET time_zone = '+8:00';
-
DATETIME
只能反映处插入时当地的时区,其它时区的人查看数据必然会有误差
-
开发经验
在实际项目中,尽量使用DATETIME,这个数据类型包括了完整的日期和时间信息,取值范围最大
七、文本字符串
-
CHAR类型
CHAR(M) 0 <= M <= 255 固定长度 浪费存储空间 效率高
数据的实际长度比CHAR类型声明的长度小,则会在右侧填充空格以达到指定的长度
-
VARCHAR类型
VARCHAR(M) 0 <= M <= 65535 可变长度 节省存储空间
在定义时,必须指定长度M,否则报错,且VARCHAR类型的字段所占用的存储空间会比M多1个字节,用来存储字符串的实际长度
-
TEXT
可存储比较大的文本段,但被删除后容易导致’ 空洞 ‘
八、ENUM类型
CREATE TABLE test_enum(
season ENUM('春','夏','秋','冬','unknow')
);
INSERT INTO test_enum
VALUES('春'),('秋');
九、SET类型
-
SET表示一个字符串对象,可包含0或多个成员,成员上限64。
-
操作
CREATE TABLE test_set( s SET('A','B','C','D') ); # 与ENUM不同之处,可一次插入多个数值 INSERT INTO test_enum VALUES ('A'), ('B,C,D');
十、二进制
-
二进制与字符型比较
BINARY(M) VARBINARY(M) CAHR(M) VARCHAR(M) 特点 固定长度 可变长度 固定长度 值的长度 0 - 255 0 - 65535 0 - 255 默认值 1 必须指定长度 1 -
BLOG类型
二进制字符串类型 长度范围 占用空间 TINYBLOB 0 - 255 BLOB 0 - 65535 64K MEDIUMBLOB 0 - 16777215 16MB LONGBLOB 0 - 4294967295 4GB -
由于BLOB和TEXT类似,删除时会留下空洞,且检索起来会很费时,网络传输也会浪费大量资源,故可以把该类数据分离到单独的表中。