MySQL常用数据类型解疑

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官方文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值