MySQL 数据类型

整数类型

分类类型字节范围
整数类型TINYINT1-128 ~ 127
SMALLINT2-32768 ~ 32767
MEDIUMINT3-8388608 ~ 8388607
INT(INTEGER)4-2^31 ~ 2^31-1
BIGINT8-2^63 ~ 2^63-1

int默认的M属性值为11

可选属性"M"

注释:

M:表示显示宽度

例如 :

int(5) 表示数据宽度小于5时,数字前面需要用字符填满宽度;

该功能需要配合“补零”使用,表示用“0”填满宽度,否则指定显示宽度无效

问题

如果设置了显示宽度,插入的数据宽度超过显示宽度限制,会不会截断或插入失败?

答案:不会对插入的数据有任何的影响,还是按照类型的实际宽度进行保存,即显示宽度与类型可以存储的值范围无关

如果不指定显示宽度,则系统为每一种类型指定默认的宽度值

从MySQL8.0.17开始,整数类型数据不推荐使用显示宽度属性

浮点类型

分类类型字节范围
浮点类型FLOAT4存储需要有4个字节,数据精确度为7位小数
DOUBLE8存储需要有8个字节,数据精确度为15位小数

浮点精度说明

注释:

FLOAT(M,D)或DOUBLE(M,D):

  1. 这里M称为精度,D称为标度(数点右侧数字的数目);

  2. 其中M = 整数位 + 小数位,D = 小数位;D <= M <=255,0 <= D <=30

不管是否显示设置了精度(M,D),这里MySQL的处理方案如下:

  1. 存储时,整数部分超出了范围,MySQL会报错
  2. 存储时,小数部分若超出了范围,分以下情况:
    • 四舍五入,整数部分没有超出范围,则只警告;成功后四舍五入删除多余的小数位,例如:FLOAT(5,2)插入999.009,近似结果为999.01
    • 四舍五入,整数部分超出范围,则会报错,并拒绝处理

从MySQL 8.0.17开始,FLOAT(M,D)和DOUBLE(M,D)用法在官方文档中已经明确不推荐使用,将来可能被移除

精度误差说明

问题还是出在MySQL对浮点类型数据的存储方式上

MySQL用4个字节的存储FLOAT类型数据,用8个字节来存储DOUBLE类型数据

都是采用二进制的方式来进行存储的,无法用一个二进制数来精确表达;进而,只好在取值允许的范围内进行四舍五入

定点数类型

分类类型字节范围
定点数类型DECIMAL(P,[S])M + 2字节有效范围由M和D决定

定点数精度说明

DECIMAL(M,D)的方式表示高精度小数

其中,M被称为精度,D被称为标度;M的默认为10,D的默认为0;0 <=M <=65,0 <=D <=30,D<M

定点数和浮点数的比较

浮点数取值范围大,不精准
定点数取值范围小,精准,没有误差

日期与时间类型

类型名称格式字节取值范围
YEARYYYY或YY11901 ~ 2155
DATE日期YYYY-MM-DD3-838:59:59 ~ 838.59:59
TIME时间HH:MM:SS31000-01-01 ~ 9999-12-3
DATETIME日期时间 YYYY-MM-DD HH:MM:SS81000-01-01 00:00:00 ~ 9999-12-3 23:59:59
TIMESTAMP日期时间YYYY-MM-DD HH:MM:SS41970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC (UTC表示世界统一规则)

YEAR类型

YEAR有两种存储方式:

  1. 以4位字符串或数字格式表示YEAR类型,
  2. 以2位字符串格式表示YEAR类型,最小值00,最大值99
    • 取值为01 ~ 69时,表示2001 ~ 2069;
    • 取值为70 ~ 99时,表示1970 ~ 1999;

从MySQL 5.5.27开始,2位格式的YEAR已经不推荐使用;默认就是YYYY

从MySQL 8.0.19开始,不推荐使用指定显示宽度

TIME类型

DATETIME类型

注释:

  1. 以YYYYMMDDHHMMSS格式的数字会被转化为YYYY-MM-DD HH:MM:SS格式

  2. 以YY-MM-DD HH:MM:SS格式或者YYMMDDHHMMSS格式,

​ 两位数(YY)的年份规则符合YEAR类型的规则

TIMESTAMP类型

注释:

  1. 存储数据的时候需要对当前所在的时区进行转换,查询数据的时候再将时间转换回当前的时区;

  2. 使用TIMESTAMP存储的同一个时间值,在不同的时区查询时会显示不同的时间

DATETIME与TIMESTAMP的区别

注释:

  1. TTIMESTAMP存储的空间比较小,表示的时间范围也比较小
  2. 底层存储的方式不同,TIMESTAMP底层存储的是毫秒值,距离1970-1-1 0:0:0毫秒的值
  3. 两个日期比较大小或日期计算时,TIMESTAMP更方便,更快
  4. TIMESTAMP和时区有关,TIMESTAMP会根据用户时区不同,显示不同的结果;而DATETIME则只能反应插入时当地的时区,其他时区的人查看数据必然会有误差的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值