目录
正在加载目录…
专栏文章
专栏文章
MySQL 系列
1. MySQL:核心概念、架构与使用场景 2. MySQL 数据类型与 Java 类型映射 3. MySQL 基础架构与执行流程 4. MySQL InnoDB 日志系统 5. MySQL 事务与 MVCC 6. MySQL 索引原理与优化 7. MySQL 锁机制 8. MySQL 性能问题排查 9. MySQL 主备复制与高可用 10. MySQL 实战技巧与常见陷阱 11. MySQL 数据库设计规范 12. MySQL SQL 函数与查询技巧 13. MySQL InnoDB Buffer Pool 原理 14. MySQL 排序与聚合原理

MySQL 数据类型与 Java 类型映射

发布于 2026-05-26 10:32 · 最后编辑于 2026-07-31 15:52 · 字数 2,507 👁 94 次阅读

MySQL 数据类型与 Java 类型的完整映射手册,涵盖整数、浮点、字符串、日期、二进制等所有类型,以及 MyBatis 特殊映射和常见踩坑点。

MySQL 系列MySQL 简介 · MySQL 数据库设计规范 · MySQL 索引原理与优化

整数类型

MySQL 类型字节有符号范围无符号范围Java 类型备注
TINYINT1-128 ~ 1270 ~ 255Byte / Integer通常用 Integer,避免拆箱坑
SMALLINT2-32,768 ~ 32,7670 ~ 65,535Short / Integer很少单独使用
MEDIUMINT3-8,388,608 ~ 8,388,6070 ~ 16,777,215Integer
INT4-2,147,483,648 ~ 2,147,483,6470 ~ 4,294,967,295Integer普通 ID、状态码首选
BIGINT8-9.2×10¹⁸ ~ 9.2×10¹⁸0 ~ 1.8×10¹⁹Long分布式 ID、时间戳必用

[!tip] 选型原则

  • 主键 ID → BIGINT UNSIGNED + Java Long
  • 业务状态/枚举 → TINYINT + Java Integer(MyBatis 可映射枚举)
  • 计数器/普通数字 → INT + Java Integer
  • 避免用 TINYINT(1) 存布尔,会被 JDBC 驱动自动映射为 Boolean,建议显式加 tinyint1isBit=false

浮点 / 定点类型

MySQL 类型字节精度Java 类型备注
FLOAT4~7 位有效数字Float不精确,慎用于金额
DOUBLE8~15 位有效数字Double不精确,慎用于金额
DECIMAL(M,D)变长精确BigDecimal金额/价格必用

[!warning] 金额存储铁律 金额字段必须使用 DECIMAL(19,4) + Java BigDecimal禁止使用 FLOAT/DOUBLE

price DECIMAL(19, 4) NOT NULL DEFAULT '0.0000' COMMENT '价格'
private BigDecimal price;

字符串类型

MySQL 类型最大长度存储方式Java 类型备注
CHAR(N)255 字符定长,不足补空格String定长编码(MD5、UUID 去横线)
VARCHAR(N)65,535 字节变长,1-2 字节前缀String通用文本字段
TINYTEXT255 字节变长String很少用
TEXT65,535 字节变长String短文本内容
MEDIUMTEXT16MB变长StringJSON 配置、长文本
LONGTEXT4GB变长String日志、超长内容(慎用)
JSON同 LONGTEXT二进制优化StringMySQL 5.7.8+

[!tip] VARCHAR 选型原则

  • 短标识符(名称、编码)→ VARCHAR(64)VARCHAR(128)
  • 业务描述 → VARCHAR(512)
  • URL / 路径 → VARCHAR(2048)
  • 超过 2048 考虑用 TEXT
  • VARCHAR(N) 的 N 是字符数,不是字节数(utf8mb4 每字符最多 4 字节)

日期 / 时间类型

MySQL 类型字节范围Java 类型备注
DATE31000-01-01 ~ 9999-12-31LocalDate仅日期
TIME3-838:59:59 ~ 838:59:59LocalTime仅时间
DATETIME81000-01-01 00:00:00 ~ 9999-12-31 23:59:59LocalDateTime不含时区
TIMESTAMP41970-01-01 00:00:01 ~ 2038-01-19 03:14:07LocalDateTime / Date含时区转换,2038 问题
YEAR11901 ~ 2155Integer极少用

[!warning] TIMESTAMP vs DATETIME

  • TIMESTAMP 会随时区变化,存储 UTC,取出自动转本地时区
  • DATETIME 存什么取什么,无时区概念
  • 推荐使用 DATETIME + Java LocalDateTime,避免时区问题
  • 创建时间/更新时间 → DATETIME DEFAULT CURRENT_TIMESTAMP

二进制类型

MySQL 类型最大长度Java 类型备注
BINARY(N)255 字节byte[]定长二进制
VARBINARY(N)65,535 字节byte[]变长二进制
BLOB65,535 字节byte[]二进制对象
MEDIUMBLOB16MBbyte[]
LONGBLOB4GBbyte[]

[!caution] 二进制存储建议 文件/图片等大二进制数据不建议存 MySQL,应使用对象存储(S3Plus/OSS),MySQL 只存 URL。

布尔 / 枚举 / 集合

MySQL 类型说明Java 类型备注
BOOLEAN / BOOL等同 TINYINT(1)Boolean / Integer注意 JDBC 驱动映射
ENUM('a','b')枚举字符串String / 自定义 Enum修改枚举值需 DDL,谨慎
SET(...)集合String很少用

完整 Java ↔ MySQL 类型对应速查

Java Type          → MySQL Type
─────────────────────────────────────────
Boolean            → TINYINT(1)
Byte               → TINYINT
Short              → SMALLINT
Integer            → INT
Long               → BIGINT
Float              → FLOAT
Double             → DOUBLE
BigDecimal         → DECIMAL(M,D)
String             → VARCHAR(N) / TEXT / CHAR(N)
byte[]             → BLOB / VARBINARY
java.util.Date     → DATETIME / TIMESTAMP
java.sql.Date      → DATE
java.sql.Timestamp → TIMESTAMP
LocalDate          → DATE
LocalTime          → TIME
LocalDateTime      → DATETIME
Enum               → VARCHAR / TINYINT(存 ordinal 或 name)

MyBatis / MBG 特殊映射

场景MySQLJavaMyBatis 配置
枚举字段TINYINTSomeEnumtypeHandler=EnumOrdinalTypeHandler
JSON 字段JSON / TEXT自定义 BO自定义 TypeHandler
乐观锁版本BIGINTLong配合 @Version 或手动 CAS
软删除状态TINYINTStatusEnum枚举 TypeHandler
分布式 IDBIGINT UNSIGNEDLong注意无符号溢出,Java Long 最大值够用

常用建表规范

CREATE TABLE `t_example` (
  `id`          BIGINT       NOT NULL AUTO_INCREMENT COMMENT '主键',
  `entity_key`  VARCHAR(128) NOT NULL DEFAULT '' COMMENT '业务唯一键',
  `status`      TINYINT      NOT NULL DEFAULT 1  COMMENT '状态 1-有效 0-无效',
  `amount`      DECIMAL(19,4)NOT NULL DEFAULT '0.0000' COMMENT '金额',
  `ext_info`    VARCHAR(2048)         DEFAULT NULL COMMENT '扩展JSON',
  `created_at`  DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at`  DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_entity_key` (`entity_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='示例表';

常见坑点速记

[!bug] 高频踩坑

  1. TINYINT(1) 被驱动当 Boolean:在 JDBC URL 加 tinyint1isBit=false
  2. TIMESTAMP 2038 问题:新表统一用 DATETIME
  3. VARCHAR 长度是字符数VARCHAR(255) 在 utf8mb4 下最大 1020 字节
  4. INT(11) 括号无意义:括号只影响展示宽度,不影响存储范围(MySQL 8.0.17 已废弃)
  5. 枚举用 ordinal 存储:Java 枚举顺序变化会导致数据错乱,建议用 name() 或指定 code 字段
  6. DECIMAL 精度DECIMAL(19,4) 最多 15 位整数 + 4 位小数
  7. 分布式 ID 用 BIGINTINT 上限约 21 亿,高并发系统容易溢出

参考

← 返回列表

评论 (0)

暂无评论,来留下第一条吧。
登录注册 后才能发表评论