1.MySQL 的 TINYINT(1) 误转成 PG 的 BOOLEAN
✗ 错误MySQL 表有 TINYINT(1) 字段,直接转成 PostgreSQL 的 BOOLEAN
✓ 修复TINYINT(1) → SMALLINT(或保留为 INTEGER)
MySQL 中 TINYINT(1) 仅表示显示宽度为 1,仍是整数类型;PG 的 BOOLEAN 语义不同,转换后查询条件需重写,且数据范围不兼容。
2.Oracle 的 NUMBER 未指定精度,转成 PG 后丢失小数
✗ 错误Oracle 字段 NUMBER → PostgreSQL 字段 INTEGER
✓ 修复NUMBER → NUMERIC(或 DECIMAL)
Oracle 的 NUMBER 默认可存储小数,INTEGER 只接受整数,直接转换会导致数据截断或插入失败,应保留为 NUMERIC 类型。
3.SQLite 的 TEXT 直接转成 MySQL 的 VARCHAR 忽略长度
✗ 错误SQLite 字段 TEXT → MySQL 字段 VARCHAR
✓ 修复SQLite 的 TEXT → MySQL 的 TEXT 或 LONGTEXT
SQLite 的 TEXT 无长度限制,而 MySQL 的 VARCHAR 有 65535 字节上限;直接转换可能导致长文本截断,应使用 TEXT 系列类型。
4.MySQL 的 DATETIME 转 Oracle 时误用 DATE
✗ 错误MySQL 字段 DATETIME → Oracle 字段 DATE
✓ 修复DATETIME → TIMESTAMP
Oracle 的 DATE 类型包含时分秒但精度为秒,而 MySQL 的 DATETIME 支持微秒(6 位小数),转 DATE 会丢失毫秒部分,应使用 TIMESTAMP。
5.PG 的 SERIAL 转 MySQL 时直接写 INT
✗ 错误PostgreSQL 字段 SERIAL → MySQL 字段 INT
✓ 修复SERIAL → INT AUTO_INCREMENT
SERIAL 是 PG 的自动递增整数语法,MySQL 使用 AUTO_INCREMENT 实现相同功能;仅转类型不转自增属性会导致插入时需手动指定 ID。
6.Oracle 的 VARCHAR2 转 SQLite 时忽略字符集差异
✗ 错误Oracle 字段 VARCHAR2(100) → SQLite 字段 VARCHAR(100)
✓ 修复VARCHAR2(100) → TEXT(或 VARCHAR(100) 但注意字节数)
Oracle 的 VARCHAR2 按字节计数(如 100 字节),SQLite 的 VARCHAR 按字符计数;中文字符在 Oracle 中可能只存 33 个,直接转换会溢出。
7.MySQL 的 ENUM 转 PG 时直接写 TEXT
✗ 错误MySQL 字段 ENUM('a','b','c') → PostgreSQL 字段 TEXT
✓ 修复ENUM('a','b','c') → 自定义类型 CREATE TYPE my_enum AS ENUM('a','b','c')
ENUM 在 MySQL 中限制值范围,转成 TEXT 会失去约束,允许插入非法值;PG 支持自定义 ENUM 类型,应创建同名枚举以保持业务规则。
8.PG 的 JSONB 转 MySQL 时误用 JSON
✗ 错误PostgreSQL 字段 JSONB → MySQL 字段 JSON
✓ 修复JSONB → JSON(但注意功能差异)
MySQL 8.0+ 的 JSON 类型与 PG 的 JSONB 存储格式不同,MySQL 不支持 @> 等部分 JSONB 操作符,转换后需手动改写查询逻辑。