将MySQL表迁移至PostgreSQL:tinyint转boolean的适配问题
解决MySQL tinyint(0/1)迁移至PostgreSQL boolean列的问题
以下是几种靠谱的解决方法,按推荐优先级排序:
1. 临时开启PostgreSQL的整数转布尔兼容模式
PostgreSQL提供会话级参数integer_bool,开启后会自动将整数0识别为false、1识别为true,完美适配你的场景:
- 执行SQL文件前,先在psql中运行:
SET integer_bool = on; - 接着执行迁移SQL文件:
psql -d your_db -U your_user -f dump.sql - 迁移完成后,该参数会随会话结束自动失效,也可手动关闭:
SET integer_bool = off;
优点:无需修改导出的SQL文件,操作简单,不会误改其他整数类型数据。
2. 自定义mysqldump导出逻辑,精准转换tinyint列
如果不想依赖兼容参数,可以在导出时就把tinyint列转为布尔值:
- 针对目标表编写自定义SELECT语句导出,示例:
SELECT id, name, CASE WHEN is_active = 1 THEN 'true' ELSE 'false' END AS is_active, age FROM your_mysql_table INTO OUTFILE '/tmp/table_data.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"'; - 再用PostgreSQL的
COPY命令导入CSV文件,或者基于生成的CSV编写INSERT语句,这样导出的布尔列直接是true/false,不会报错。
优点:从源头上解决类型不匹配问题,迁移后数据更规范,适合需要精准控制的场景。
3. 使用专业迁移工具pgloader
pgloader是专门用于异构数据库迁移的工具,能自动处理MySQL到PostgreSQL的类型映射(包括tinyint→boolean):
- 编写简单的加载配置文件(比如
load.toml):[[load]] source = "mysql://user:pass@localhost/your_db" target = "postgresql://user:pass@localhost/your_pg_db" tables = ["your_table1", "your_table2"] - 执行迁移命令:
pgloader load.toml
优点:自动化程度高,适合批量迁移多张表,还能处理其他类型映射问题,减少手动操作。
内容的提问来源于stack exchange,提问作者mattstuehler
相关产品推荐
相关产品推荐

