整数类型
分类 | 类型 | 字节 | 范围 |
整数类型 | TINYINT | 1 | -128 ~ 127 |
SMALLINT | 2 | -32768 ~ 32767 | |
MEDIUMINT | 3 | -8388608 ~ 8388607 | |
INT(INTEGER) | 4 | -2^31 ~ 2^31-1 | |
BIGINT | 8 | -2^63 ~ 2^63-1 |
int默认的M属性值为11
可选属性"M"
注释:
M:表示显示宽度,
例如 :
int(5) 表示数据宽度小于5时,数字前面需要用字符填满宽度;
该功能需要配合“补零”使用,表示用“0”填满宽度,否则指定显示宽度无效
问题
如果设置了显示宽度,插入的数据宽度超过显示宽度限制,会不会截断或插入失败?
答案:不会对插入的数据有任何的影响,还是按照类型的实际宽度进行保存,即显示宽度与类型可以存储的值范围无关
如果不指定显示宽度,则系统为每一种类型指定默认的宽度值
从MySQL8.0.17开始,整数类型数据不推荐使用显示宽度属性
浮点类型
分类 | 类型 | 字节 | 范围 |
浮点类型 | FLOAT | 4 | 存储需要有4个字节,数据精确度为7位小数 |
DOUBLE | 8 | 存储需要有8个字节,数据精确度为15位小数 |
浮点精度说明
注释:
FLOAT(M,D)或DOUBLE(M,D):
-
这里M称为精度,D称为标度(数点右侧数字的数目);
-
其中M = 整数位 + 小数位,D = 小数位;D <= M <=255,0 <= D <=30
不管是否显示设置了精度(M,D),这里MySQL的处理方案如下:
- 存储时,整数部分超出了范围,MySQL会报错
- 存储时,小数部分若超出了范围,分以下情况:
- 四舍五入,整数部分没有超出范围,则只警告;成功后四舍五入删除多余的小数位,例如: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
定点数和浮点数的比较
浮点数 | 取值范围大,不精准 |
---|---|
定点数 | 取值范围小,精准,没有误差 |
日期与时间类型
类型 | 名称 | 格式 | 字节 | 取值范围 |
YEAR | 年 | YYYY或YY | 1 | 1901 ~ 2155 |
DATE | 日期 | YYYY-MM-DD | 3 | -838:59:59 ~ 838.59:59 |
TIME | 时间 | HH:MM:SS | 3 | 1000-01-01 ~ 9999-12-3 |
DATETIME | 日期时间 | YYYY-MM-DD HH:MM:SS | 8 | 1000-01-01 00:00:00 ~ 9999-12-3 23:59:59 |
TIMESTAMP | 日期时间 | YYYY-MM-DD HH:MM:SS | 4 | 1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC (UTC表示世界统一规则) |
YEAR类型
YEAR有两种存储方式:
- 以4位字符串或数字格式表示YEAR类型,
- 以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类型
注释:
-
以YYYYMMDDHHMMSS格式的数字会被转化为YYYY-MM-DD HH:MM:SS格式
-
以YY-MM-DD HH:MM:SS格式或者YYMMDDHHMMSS格式,
两位数(YY)的年份规则符合YEAR类型的规则
TIMESTAMP类型
注释:
-
存储数据的时候需要对当前所在的时区进行转换,查询数据的时候再将时间转换回当前的时区;
-
使用TIMESTAMP存储的同一个时间值,在不同的时区查询时会显示不同的时间
DATETIME与TIMESTAMP的区别
注释:
- TTIMESTAMP存储的空间比较小,表示的时间范围也比较小
- 底层存储的方式不同,TIMESTAMP底层存储的是毫秒值,距离1970-1-1 0:0:0毫秒的值
- 两个日期比较大小或日期计算时,TIMESTAMP更方便,更快
- TIMESTAMP和时区有关,TIMESTAMP会根据用户时区不同,显示不同的结果;而DATETIME则只能反应插入时当地的时区,其他时区的人查看数据必然会有误差的