MySQL 与 PostgreSQL 的数据类型差异
对比 MySQL 和 PostgreSQL 在数值、字符串、布尔、自增、JSON 和约束表达上的差异,帮助建模与迁移时少踩坑。
#type / synthesis
#status / growing
#tech / dev / backend
#resource / mysql
#resource / postgresql
[!info] related notes
- 所属 MOC: 数据库 MOC
- 相关概念: SQL, 主键、外键与约束
- 易混淆概念:
- 相关资源: MySQL, PostgreSQL
MySQL 与 PostgreSQL 的数据类型差异
范围
这篇只聚焦“建模时最常碰到的类型与约束表达差异”,不展开所有厂商细节。
为什么要放在一起理解
很多“数据库可替换”的误判,都是从数据类型开始的:
- 字段定义看起来相似,但约束能力不同
- ORM 层映射看起来统一,但底层行为不同
- 迁移脚本能过,不代表语义完全一致
依赖路径 / 调用链 / 演进链
最常见的对照维度:
- 自增主键:MySQL 常见
AUTO_INCREMENT;PostgreSQL 常见GENERATED ... AS IDENTITY或历史上的SERIAL - 布尔:PostgreSQL 原生
BOOLEAN很自然;MySQL 常用TINYINT(1)语义映射 - 枚举:MySQL 常见
ENUM;PostgreSQL 既可用ENUM,也常用CHECK或独立类型 - JSON:两者都支持,但 PostgreSQL 的
JSONB在查询和索引上更强 - 时间类型:两者都支持时间,但时区语义和默认写法需要格外小心
对比与易混淆点
| 维度 | MySQL 常见写法 | PostgreSQL 常见写法 | 关注点 |
|---|---|---|---|
| 自增键 | AUTO_INCREMENT | IDENTITY / SERIAL | 迁移和建表脚本不同 |
| 枚举 | ENUM 使用较多 | ENUM、CHECK、引用表更常见 | 扩展与维护策略不同 |
| JSON | JSON | JSON / JSONB | PostgreSQL 的 JSONB 查询与索引能力更强 |
| 布尔 | 常由 TINYINT(1) 映射 | 原生 BOOLEAN | ORM 映射时要看真实类型 |
| 数组 | 支持弱 | 原生数组较强 | PostgreSQL 表达力更高,但也更容易做出复杂 schema |
不要把“都能存进去”误当成“语义完全等价”。