You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 13:10:49