整数类型

字符串类型

两种存储类型

其中最常使用的是 CHAR、VARCHAR。
CHAR(N) 用来保存固定长度的字符,N 的范围是 0 ~ 255,N 表示的是字符。
VARCHAR(N) 用来保存变长字符,N 的范围为 0 ~ 65536, N 表示字符。

两种字符集

每种字符在不同字符集编码下,对应着不同的二进制值。常见的字符集有 GBK、UTF8,通常推荐把默认字符集设置为 UTF8。推荐把 MySQL 的默认字符集设置为 UTF8MB4。

不同的字符集,CHAR(N)、VARCHAR(N) 对应最长的字节也不相同。比如 GBK 字符集,1 个字符最大存储 2 个字节,UTF8MB4 字符集 1 个字符最大存储 4 个字节。

在表结构设计时,CHAR 本质在底层存储上也是变长,可以把 CHAR 替换为 VARCHAR。

排序规则

排序规则(Collation)是比较和排序字符串的一种规则,每个字符集都会有默认的排序规则。
绝大多数场景下,比较 MySQL 字符串,都默认采用不区分大小的排序规则。

时间类型

两种常用类型

常用的日期类型有 DATETIME、TIMESTAMP。
DATETIME 展现形式为:YYYY-MM-DD HH:MM:SS,固定占用 8 个字节。
DATETIME(N) 中的 N 表示毫秒的精度。

TIMESTAMP 实际存储的内容为‘1970-01-01 00:00:00’到现在的毫秒数。

DATETIME 和 TIMESTAMP 精度支持到毫秒(>=MySQL 5.6);

DATETIME、DATETIME(6) 都是占用 8 个字节,
TIMESTAMP 占用 4 个字节,TIMESTAMP(6) 占用 7 个字节;

TIMESTAMP 时区

TIMESTAMP 最大优点是时区属性
列 register_date 表示注册时间
DEFAULT CURRENT_TIMESTAMP 表示记录插入时,若没有指定时间,默认就是当前时间。

列 last_modify_date 表示当前记录最后的修改时间
DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) 表示每次修改都会修改为当前时间。

TIMESTAMP 也有性能问题。
01 必须显式设置time_zone
使用默认系统时区时,每次会通过时区计算时间,而 OS 底层 __tz_convert() 函数有加锁操作,并发访问导致性能问题。
设置time_zone,推荐在配置文件中设置参数 time_zone = ‘+08:00’;

02 TIMESTAMP 的最大值‘2038-01-19 03:14:07’

优先使用 DATETIME

推荐日期类型使用 DATETIME,而不是 TIMESTAMP 和 INT 类型;
时间精确到毫秒,TIMESTAMP 要 7 个字节,和 DATETIME 8 字节差不太多
(时区)问题,可以由前端或者服务做转化,不一定非要在数据库中解决。

last_modify_date 字段

设计核心业务表结构时,推荐设计 last_modify_date 字段,设置 ON UPDATE CURRENT_TIMESTAMP(6),自动记录每条记录的最后修改时间。

好处:用户可以知道最近一次记录更新的时间,以便做后续的处理。比如:
在电商的订单表中,可以方便对支付超时的订单做处理;
在金融业务中,可以根据用户资金最后的修改时间做相应的资金核对等。
MySQL 数据库的主从逻辑数据核对。