MySQL 与 PostgreSQL 的数据类型差异

对比 MySQL 和 PostgreSQL 在数值、字符串、布尔、自增、JSON 和约束表达上的差异,帮助建模与迁移时少踩坑。

#type / synthesis #status / growing #tech / dev / backend #resource / mysql #resource / postgresql

[!info] related notes

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_INCREMENTIDENTITY / SERIAL迁移和建表脚本不同
枚举ENUM 使用较多ENUMCHECK、引用表更常见扩展与维护策略不同
JSONJSONJSON / JSONBPostgreSQL 的 JSONB 查询与索引能力更强
布尔常由 TINYINT(1) 映射原生 BOOLEANORM 映射时要看真实类型
数组支持弱原生数组较强PostgreSQL 表达力更高,但也更容易做出复杂 schema

不要把“都能存进去”误当成“语义完全等价”。

创建于 2026/5/3 更新于 2026/5/27