常用数据类型速查
数值类型
| 类型 | 存储 | 范围与说明 |
|---|---|---|
TINYINT | 1 字节 | 有符号 -128 ~ 127;无符号 0 ~ 255 |
SMALLINT | 2 字节 | 有符号 -32768 ~ 32767;无符号 0 ~ 65535 |
MEDIUMINT | 3 字节 | 有符号 -8388608 ~ 8388607;无符号 0 ~ 16777215 |
INT | 4 字节 | 有符号 -2^31 ~ 2^31-1;无符号 0 ~ 2^32-1 |
BIGINT | 8 字节 | 有符号 -2^63 ~ 2^63-1;无符号 0 ~ 2^64-1 |
FLOAT | 4 字节 | 单精度近似浮点,不用于精确比较 |
DOUBLE | 8 字节 | 双精度近似浮点,不用于精确比较 |
DECIMAL(M,D) | 按数字组打包 | 定点数;M 为总位数,D 为小数位 |
AUTO_INCREMENT 用于整数和近似浮点类型,但生产主键通常使用整数类型。业务范围不足时不能依赖 UNSIGNED 掩盖设计问题。
字符串类型
| 类型 | 声明上限 | 存储与说明 |
|---|---|---|
CHAR(N) | 0 ~ 255 个字符 | 固定长度字符;不足时按排序规则补空格,检索时默认移除尾随空格 |
VARCHAR(N) | 0 ~ 65535 个字符 | 变长字符;另存 1 或 2 字节长度前缀,实际上限还受行大小和字符集约束 |
TINYTEXT | 255 字节 | 小文本;多字节字符会占用更多字节 |
TEXT | 65535 字节 | 常规文本;有效字符数随字符集变化 |
MEDIUMTEXT | 16777215 字节 | 中等长度文本 |
LONGTEXT | 约 4 GB | 超长文本 |
BLOB | 65535 字节 | 二进制大对象;长度按字节计算 |
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 为准,不要假设旧行为会自动改变。
日期与时间类型
| 类型 | 形式 | 说明 |
|---|---|---|
DATE | YYYY-MM-DD | 仅日期 |
TIME | HH:MM:SS | 时间或时间差,可配置小数秒精度 |
DATETIME | YYYY-MM-DD HH:MM:SS | 不带时区;可配置小数秒精度,范围较宽 |
TIMESTAMP | YYYY-MM-DD HH:MM:SS | 存储 UTC 值,按会话时区转换;范围为 1970-01-01 到 2038-01-19 |
YEAR | YYYY 或 2 位数字形式 | 年份类型,按配置解释两位年份 |
应用若需要无歧义的日期时间,应让数据库、JDBC、应用和 JVM 使用一致的时区策略,并在接口上明确时区或偏移量。
选型原则
- 主键优先选择紧凑、单调或时间有序的值;随机 UUID 可能造成聚簇索引写放大,UUIDv7 等时间有序标识可以作为替代评估。
- 金额、汇率和账务计算使用
DECIMAL,不要用FLOAT或DOUBLE承担精确计算。 BOOLEAN是TINYINT(1)的同义类型;如果使用TINYINT表示状态,应定义允许值或约束,不依赖显示宽度表达业务语义。- 枚举值稳定且集合很小时可评估
ENUM;状态经常扩展或需要集中维护时,通常使用整数/字符码加应用字典。 DATETIME适合记录无时区业务时间;需要自动 UTC 转换或覆盖 2038 边界时评估TIMESTAMP,同时确认目标业务范围。- 二级索引可以直接覆盖
VARCHAR;对BLOB/TEXT建普通二级索引必须指定前缀长度,索引只包含前缀。需要完整文本检索时使用FULLTEXT,前缀索引不能替代全文语义。