常见字段对应的 MySQL 数据类型
作者:
catroll
日期:
2020-08-12
标签:
MySQL
DB
字段 |
MySQL 数据类型 |
备注 |
用户 ID |
INT UNSIGNED |
- |
用户名称 |
VARCHAR(255) |
按需调整长度 |
年龄 |
TINYINT UNSIGNED |
0 - 255 |
性别 |
ENUM('男', '女') |
若性别选项较多,可改用 VARCHAR 😂 |
国家地区 |
VARCHAR(100) |
或使用 ISO 3166 国家代码(CHAR(4)) |
电话号码 |
VARCHAR(20) |
可包含符号(如 +、-)和空格(考虑加密存储) |
URL |
VARCHAR(2083) |
- |
Email 地址 |
VARCHAR(255) |
配合正则验证(考虑加密存储) |
IP 地址 |
VARBINARY(16) |
INET_ATON / INET_NTOA / INET6_ATON / INET6_NTOA |
APIKey |
VARCHAR(255) |
加密 / 哈希后的密钥 |
雪花 ID |
BIGINT UNSIGNED |
- |
日期 |
DATE |
日期 |
时间 |
TIME |
时间(不含日期) |
日期时间 |
DATETIME |
如需考虑时区,统一转换成 UTC / 北京时间存储 |
时间戳 |
TIMESTAMP |
无时区问题,且存储空间小(如果可以忽略 2038 问题) |
年 |
YEAR |
1 字节,1901 - 2155 |
状态 |
TINYINT |
- |
关于状态,个人偏好使用 TINYINT
数据类型 |
优点 |
缺点 |
备注 |
ENUM |
可读性 + 存储高效 |
拓展性差(增加类型需要改表) |
适合修改频率极低 |
TINYINT |
存储高效 |
可读性差 |
- |
VARCHAR |
可读性 |
存储效率低 |
- |
存储 IP(IPv4 32 位 / IPv6 128 位)的常见方案
数据类型 |
存储空间(IPv4) |
存储空间(IPv6) |
可读性 |
查询效率 |
char / varchar |
15 |
39 |
高 |
低 |
unsigned int |
4 |
不支持 |
低 |
高 |
binary / varbinary |
4 |
16 |
低 |
高 |
常见操作:排序,按网段查询
- char 可读但低效,即便去掉小数点,每一段对齐到 3 位,IPv4 也需要 12 字节(牺牲可读性)
- int 的问题是无法支持 IPv6
存储日期时间的常见方案
- 仅需日期时用
DATE
(3 字节),仅需年份时用YEAR
(1 字节)。
- 格式:
- 无时区: 2025-06-17 15:30:00
- ISO 8601: 2025-06-17T15:30:00+08:00
- 精度:秒,毫秒,微秒,纳秒
- 普通业务(如订单时间)用秒级(
DATETIME
/TIMESTAMP
);
- 金融交易、性能监控需毫秒/微秒级(
DATETIME(3)
/BIGINT
)。
- 2038 问题:1970-01-01 00:00:01.000000 ~ 2038-01-19 03:14:07.499999
- 截止到最新的 8.0 版本,TIMESTAMP 类型的 2038 年问题依然没有解决。
- MySQL 5.6+ 支持 datetime / timestamp 带小数位,最多支持 6 位小数(微秒级)
数据类型 |
大小 |
精度 |
时间范围 |
描述 |
DATETIME |
8 字节 |
秒级 |
1000 - 9999 |
- |
DATETIME(n) |
8+2n 字节 |
微秒级 |
1000 - 9999 |
n 表示小数位(0 ~ 6),毫秒:n = 3 |
TIMESTAMP |
4 字节 |
秒级 |
1970 - 2038 |
按 UTC 时间存储,查询时自动转换时区,存在 2038 问题 |
TIMESTAMP(n) |
4+2n 字节 |
微秒级 |
1970 - 2038 |
支持毫秒/,存在 2038 问题 |
UNSIGNED INT |
4 字节 |
秒级 |
1970 - 2038 |
和 timestamp 一致,存在 2038 问题 |
UNSIGNED BIGINT |
8 字节 |
毫秒级 |
♾️ |
无溢出风险 |
CHAR(19) |
19 字节 |
任意 |
♾️ |
YYYY-MM-DD HH:MM:SS ,可读但低效 |
VARCHAR(25) |
25 字节 |
任意 |
♾️ |
2025-06-17T15:30:00+08:00 ,可读但低效 |
如果你有魔法,你可以看到一个评论框~