Skip to content

常用数据类型速查 ​

本页只记录常用类型的长度、存储和比较语义。字符集与排序规则见字符集与排序规则,字段与主键选择见索引设计。

数值类型 ​

类型存储范围与说明
TINYINT1 字节有符号 -128 ~ 127;无符号 0 ~ 255
SMALLINT2 字节有符号 -32768 ~ 32767;无符号 0 ~ 65535
MEDIUMINT3 字节有符号 -8388608 ~ 8388607;无符号 0 ~ 16777215
INT4 字节有符号 -2^31 ~ 2^31-1;无符号 0 ~ 2^32-1
BIGINT8 字节有符号 -2^63 ~ 2^63-1;无符号 0 ~ 2^64-1
FLOAT4 字节单精度近似浮点,不用于精确比较
DOUBLE8 字节双精度近似浮点,不用于精确比较
DECIMAL(M,D)按数字组打包定点数;M 为总位数,D 为小数位

AUTO_INCREMENT 用于整数和近似浮点类型,但生产主键通常使用整数类型。业务范围不足时不能依赖 UNSIGNED 掩盖设计问题。

字符串类型 ​

类型声明上限存储与说明
CHAR(N)0 ~ 255 个字符固定长度字符;不足时按排序规则补空格,检索时默认移除尾随空格
VARCHAR(N)0 ~ 65535 个字符变长字符;另存 1 或 2 字节长度前缀,实际上限还受行大小和字符集约束
TINYTEXT255 字节小文本;多字节字符会占用更多字节
TEXT65535 字节常规文本;有效字符数随字符集变化
MEDIUMTEXT16777215 字节中等长度文本
LONGTEXT约 4 GB超长文本
BLOB65535 字节二进制大对象;长度按字节计算
JSON最大长度受行和文档限制二进制 JSON 文档,解析、排序和部分函数行为与文本字符串不同

CHAR(N) 中的 N 不是字节数。例如在 utf8mb4 下,一个字符最多占 4 字节,CHAR(255) 可容纳 255 个字符,存储空间会随字符集和填充规则变化。

VARCHAR(65535) 也不能作为单列可声明的通用上限。单行所有列的长度字节数受 65,535 字节约束;使用 utf8mb4 时,单个 VARCHAR 列的最大可声明字符数远低于 65,535。

TEXT 的默认值 ​

  • MySQL 8.0.13 之前,BLOB、TEXT、GEOMETRY 和 JSON 类型不能使用 DEFAULT。
  • MySQL 8.0.13 起,这些类型可以使用括号中的表达式作为默认值,例如 DEFAULT (JSON_OBJECT());不能把普通字符串字面量直接当作 TEXT DEFAULT。

迁移到新版本前应以目标版本 DDL 为准,不要假设旧行为会自动改变。

日期与时间类型 ​

类型形式说明
DATEYYYY-MM-DD仅日期
TIMEHH:MM:SS时间或时间差,可配置小数秒精度
DATETIMEYYYY-MM-DD HH:MM:SS不带时区;可配置小数秒精度,范围较宽
TIMESTAMPYYYY-MM-DD HH:MM:SS存储 UTC 值,按会话时区转换;范围为 1970-01-01 到 2038-01-19
YEARYYYY 或 2 位数字形式年份类型,按配置解释两位年份

应用若需要无歧义的日期时间,应让数据库、JDBC、应用和 JVM 使用一致的时区策略,并在接口上明确时区或偏移量。

选型原则 ​

  • 主键优先选择紧凑、单调或时间有序的值;随机 UUID 可能造成聚簇索引写放大,UUIDv7 等时间有序标识可以作为替代评估。
  • 金额、汇率和账务计算使用 DECIMAL,不要用 FLOAT 或 DOUBLE 承担精确计算。
  • BOOLEAN 是 TINYINT(1) 的同义类型;如果使用 TINYINT 表示状态,应定义允许值或约束,不依赖显示宽度表达业务语义。
  • 枚举值稳定且集合很小时可评估 ENUM;状态经常扩展或需要集中维护时,通常使用整数/字符码加应用字典。
  • DATETIME 适合记录无时区业务时间;需要自动 UTC 转换或覆盖 2038 边界时评估 TIMESTAMP,同时确认目标业务范围。
  • 二级索引可以直接覆盖 VARCHAR;对 BLOB/TEXT 建普通二级索引必须指定前缀长度,索引只包含前缀。需要完整文本检索时使用 FULLTEXT,前缀索引不能替代全文语义。

Released under the MIT License.