TOC

常见字段对应的 MySQL 数据类型

字段 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

常见操作:排序,按网段查询

  1. char 可读但低效,即便去掉小数点,每一段对齐到 3 位,IPv4 也需要 12 字节(牺牲可读性)
  2. 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,可读但低效
如果你有魔法,你可以看到一个评论框~