如何将MySQL中存为字符串的数组转为PostgreSQL整数数组
解决方案:MySQL转PostgreSQL时的数组转换及类型替代问题
一、DBeaver内实现整数数组转换
1. 解决类型识别报错
DBeaver里手动输入integer[]报错,是因为类型选择需用下拉列表里的Integer Array选项(不要手动输入类型名)。如果下拉列表中找不到该选项,可先将目标列类型设为text,通过转换表达式处理后再切换为数组类型。
2. JEXL转换表达式写法
针对源数据"[1,2,3,...]"格式的字符串,在DBeaver的「转换表达式」框中写入以下JEXL代码:
// 去除前后方括号、按逗号分割后转成Integer数组 value.replaceAll("^\\[|\\]$", "").split(",").stream().map(Integer::parseInt).toArray(Integer[]::new)
写完表达式后,将目标列类型改为Integer Array,即可正确映射为PostgreSQL的integer[]类型。
二、不用DBeaver的替代方案
1. 用pgloader直接迁移(推荐)
pgloader是异构数据库迁移专用工具,可自动处理多数类型映射,包括字符串数组转PostgreSQL数组:
- 编写配置文件(如
mysql2pg.load):
LOAD DATABASE FROM mysql://user:password@host/database INTO postgresql://user:password@host/database WITH include drop, create tables, create indexes, reset sequences SET maintenance_work_mem to '1GB', work_mem to '64MB' CAST type json TO jsonb, type varchar WHEN (length <= 255) TO text CHECK (length($1) <= 255), type varchar WHEN (length > 255) TO text, type text WHEN (default ~ '^\[.*\]$') TO integer[] USING (string_to_array(trim($1, '[]'), ',')::integer[]) ;
- 执行迁移命令:
pgloader mysql2pg.load
2. CSV导出+PostgreSQL COPY导入
- 从MySQL导出CSV时,保留数组列的
[1,2,3]格式; - 在PostgreSQL中预先建表:数组列设为
integer[],原varchar(n)列设为text并添加长度约束; - 用COPY命令导入并转换:
COPY your_table (col1, array_col, col3) FROM '/path/to/your/data.csv' DELIMITER ',' CSV HEADER (array_col = string_to_array(trim(array_col, '[]'), ',')::integer[]);
三、varchar(n)转text加约束的实现
将原MySQL的varchar(n)列改为PostgreSQL的text类型,同时添加长度约束:
ALTER TABLE your_table ALTER COLUMN varchar_col TYPE text, ADD CONSTRAINT varchar_col_length CHECK (length(varchar_col) <= n);
内容的提问来源于stack exchange,提问作者siniradam
相关产品推荐
相关产品推荐

