MYSQL常用数据类型解疑(基于MySql-8.0.17)
主要内容:
1. DECIMAL、NUMERIC类型
2. FLOAT、DOUBLE类型
3. 整数类型
4. 字符类型
5. 日期时间类型
1.DECIMAL、NUMERIC
-
DECIMAL(m,n)
和NUMERIC(m,d)
一样。
其中m是精度(总位数),表示值存储的有效位数; n是小数位数,表示小数点后可存储的位数 -
最大总位数为65,但实际范围可能受给定列的精度或小数位数的限制
-
如果省略m,则默认值为10,如果省略n,则默认值为0,若DECIMAL小数位数为0,则值不包含小数点或小数部分,如:
DECIMAL,DECIMAL(M),DECIMAL(M,0),DECIMALDECIMAL(M,0)
例1
salary DECIMAL(5,2)
/*可以存储在salary 列中的值的范围是从-999.99到 999.99 */
例2
salary2 decimal(15,11)
/*
salary2为tb_temp表中某一字段
执行:
insert into tb_temp(salary2) values(2300.345255665);
结果:2300.34525566500,小数点11位,不足则补0,总位数15位
执行:
insert into tb_temp(salary2) values(23000.34525566);
错误:[Err] 1264 - Out of range value for column 'salary2' at row 1
表明小数点位数太多,会影响表示范围
*/
2.FLOAT、DOUBLE
-
FLOAT 占4 bytes,DOUBLE占 8 bytes
FLOAT(M,D) DOUBLE(M,D)
是非标准的MySQL扩展,将来的版本不再支持该语法 -
由于浮点值是近似值而不是作为精确值存储的,因此在比较中尝试将它们视为精确值可能会导致问题
-
为了获得最大的可移植性,应使用FLOAT或 DOUBLE PRECISION不指定精度或位数
例3
salary2 DOUBLE
/*
为tb_temp表中某一字段
执行:
insert into tb_temp(salary2) values(10024002300.345255665);
结果:10024002300.345255
表明默认最多保存6位小数,多余位数被截断并不会进行四舍五入
*/
例4
salary1 float
/*
tb_temp表中某一字段
执行:
insert into tb_temp(salary1) values(10.23455123);
结果:10.2346
insert into tb_temp(salary1) values(0.23455553);
结果:0.234556
insert into tb_temp(salary1) values(245245.843245665);
结果:245245
表明整数位数<6,会显示小数点并进行四舍五入,且最多显示6位小数点,整数位数>=6,不显示小数点
*/
3.整数类型
- MySQL支持SQL标准整数类型INTEGER(或INT)和SMALLINT。
- 作为对标准的扩展,MySQL还支持整数类型TINYINT,MEDIUMINT和BIGINT。
每种整数类型所需的存储空间和范围如下表:
4.字符类型
在下表中,M代表非二进制字符串类型的声明的列长度(以字符表示),代表二进制字符串类型的字节以L表示。给定字符串值的实际长度以字节为单位。
/*使用的是mysql-8.0.17版本,数据库utfmb4编码*/
tmsg char(1) default '中',
tmsg char(2) default 'ok',
tmsg char(2) default '中国',
/*
以上验证表明:
char(m)指定m个字符,1个汉字算1个字符,1个字母也算1个字符,多出字符会报错
*/
tmsg varchar(2) default '中国',
tmsg varchar(2) default 'ch',
/*
以上表明:varchar(m)与char(m)同样是指定m个字符,且1个字母或1个汉字记为1个字符,最大m个字符
建表语句中包含如下字段则会报错
ttest varchar(65535)
[Err] 1074 - Column length too big for column 'ttest' (max = 16383); use BLOB or TEXT instead
原因:
当使用了utf8mb4编码,一个字符占用4 bytes,16383*4 = 65532<65535
*/
5.日期时间类型
-
下表显示了每种类型的“零”值的格式,“零”值是特殊的,但是您可以使用表中显示的值显式存储或引用它们。
-
对于包含日期部分(DATE,DATETIME和TIMESTAMP)的时间类型,使用这些值可能会产生警告或错误。精确的行为取决于是否启用了严格和无零日期SQL模式(如果有,请参见第5.1.11节“服务器SQL模式”)。
- 对于TIME,DATETIME和TIMESTAMP列,在MySQL 5.6.4之前创建的表所需的存储与从5.6.4以后创建的表不同。这是由于5.6.4中的更改,允许这些类型具有小数部分,这需要从0到3个字节。
-
从MySQL 5.6.4开始,YEAR和DATE的存储保持不变。但是,TIME,DATETIME和TIMESTAMP的表示方式有所不同。
-
DATETIME的打包效率更高,非小数部分需要5个字节,而不是8个字节,并且所有三个部分的小数部分都需要0到3个字节,具体取决于存储值的小数秒精度。
例如:TIME(O),TIME(2),TIME(4)和TIME(6)分别使用3、4、5和6个字节。 TIME和时间TIME(0)
是等效的,并且需要相同的存储空间。
更多详细信息参考MySQL官方文档