在 MySQL 中,可以通过存储引擎来决定表的类型,即存储引擎决定了表的存储方式;同时 MySQL 中也提供了几种数据类型,而数据类型决定了表存储数据的类型。在这篇文章里,先来简单的介绍 MySQL 中的数据类型。
MySQL 支持多种数据类型,大致可以分为三类:数值、日期 \ 时间、字符串(字符)
数值类型
数值类型又分为整数类型、浮点数类型和定点数类型
日期 / 时间类型
字符串类型
几个问题
int(10) 与 int(11) 的区别
int 占 4 个字节,存储的数据范围见上表,int 后面的数字表示字符显示宽度
- 只要数据类型声明为 int,则该列所能存储的整型数据范围是固定的,不管后面的是 10 还是 11,int 的字符显示宽度大小,和能存储的数据范围大小没有关系;
- zerofill 表示数据小于字符显示宽度时,左边用 0 填充,直至达到定义的字符显示宽度;
- 若数据宽度大于等于字符显示宽度时,则正常存储,不处理该数据;
- 字符显示宽度必须和 zerofill 配合使用,不然字符显示宽度无意义;
- 使用 zerofill 填充时,会隐式的将该列设置为无符号;
- 不设置字符显示宽度和 zerofill 时,int 型默认字符显示宽度为 11。
float
float 存在许多潜在因素,要 尽量避免 使用
- 默认只能存储 6 个数字(小数点前后),超过 6 位就会显示为科学记数法,并且 6 位之后的部分会四舍五入舍去;
- 设置 float(m),m <= 24 时,精度和不设置 m 一样,都只能存储 6 个数字,m 超过 24 时,会自动转换为 double;
- 设置 float(m,d),m 表示整数和小数的最大长度,d 表示小数部分,m-d 表示整数部分,整数部分超过 m-d,插入异常,小数部分大于 d,则从第 5 位开始四舍五入去掉后面的部分,小数部分小于 d,用 0 填充,m = d 时,整数部分必须为 0;
- 浮点数存在误差问题,对货币等对精度敏感的数据,应该使用定点数存储。
double 与 decimal 区别
- double 浮点型,decimal 定点型;
- double 不指定精度,默认按实际的精度显示;
- decimal 不指定精度,默认 m = 10,d = 0;
- decimal 可以存储比 bigint 更大的整数。
datetime 与 timestamp 区别
- 存储范围不同,datetime 范围更大;
- 所占空间大小不同,timestamp 只占 4 字节;
- datetime 和时区无关,timestamp 和时区有关;
- timestamp 将时间从当前时区转化为 UTC 进行存储,查询时又转化为当前时区,datetime 原样存储;
- 都可以设置默认值为 CURRENT_TIMESTAMP,在插入和更新时会自动使用当前时间填充;
- timestamp 可以指定长度,精度到毫秒级,datetime 不可以;
- 对于跨时区的业务,timestamp 更适合。
char(4) 与 varchar(4) 区别
- 能存储的最大字符数都是 4 个,超过自动截取,字符包括汉字、英文字母和数字;
- char 存储低于 4 个,依然占 4 个字节,varchar 存储低于 4 个,占字符数 + 1 个字节;
- varchar 存储的字符数小于等于 255 个时,用 1 个字节记录字符串长度,大于 255 个时,用 2 个字节记录字符串长度。
汉字占字节大小
- 一般每个汉字 3 个字节;
- 和编码有关。
其他类型
boolean 与 bool MySQL 中没有 boolean 类型,使用 0 和 1 代表 false 和 true,设置一列为 boolean 类型,将会自动转换成 tinyint(1);
enum 枚举类型,从给定的几个值中挑选一个;
set 枚举类型,从给定的几个值中挑选一个或多个;
numeric 同 decimal 类型一样,没有任何区别。
本文原始链接:MySQL 中的数据类型和几个问题