暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

MySQL迁移到达梦数据库,CHAR类型数据迁移失败:“列[NAME]长度超出定义”

原创 陈举超 4天前
51

问题描述

使用达梦DTS迁移工具,进行MySQL迁移到达梦时,部分表char类型列数据迁移报错:
列[NAME]长度超出定义。

环境说明

数据库版本:
MySQL:8.0.**
DM:8.1.3.**

达梦相关参数:
COMPATIBLE_MODE = 0 
LENGTH_IN_CHAR = 1
CHARSET = 1 (UTF-8)

问题重现

将源库MySQL下的cjc库迁移到达梦数据库CJC用户下。

源库:MySQL创建测试数据

mysql> use cjc;
Database changed

mysql> create table t1(id int,name char(4));
Query OK, 0 rows affected (0.02 sec)

mysql> create table t2(id int,name varchar(4));
Query OK, 0 rows affected (0.01 sec)

mysql> insert into t1 values(1,'国产数据');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t2 values(1,'达梦数据');
Query OK, 1 row affected (0.01 sec)

开始迁移

图片.png

图片.png
图片.png
图片.png
图片.png
图片.png
图片.png
图片.png
图片.png

问题重现

图片.png
图片.png
图片.png
图片.png

char(4) 类型数据迁移失败,varchar(4)类型数据迁移成功。

SQL> select * from t1;
未选定行
已用时间: 0.876(毫秒). 执行号:1101.

SQL> select * from t2;

行号     ID          NAME        
---------- ----------- ------------
1          1           达梦数据

已用时间: 1.085(毫秒). 执行号:1102.

问题分析

列长度超出定义问题,第一个想到的参数是LENGTH_IN_CHAR,但是参数值已经是1了。
尝试修改 COMPATIBLE_MODE 参数,从0改成4,问题依旧。
COMPATIBLE_MODE 参数说明:

Server compatible mode:
0:none, 1:SQL92, 2:Oracle, 3:MS SQL Server, 4:MySQL, 5:DM6, 6:Teradata, 7:PG

问题可以稳定重现:
达梦数据库:
varchar(4)可以存储四个中文。

SQL> create table t2 (name varchar(4));
操作已执行
已用时间: 5.872(毫秒). 执行号:61711.

SQL> insert into t2 values('达梦数据');
影响行数 1
已用时间: 0.682(毫秒). 执行号:61712.
SQL> commit;

char(4)无法存储四个中文(MySQL可以)。

SQL> create table t2(name char(4));
操作已执行
已用时间: 5.680(毫秒). 执行号:61708.

SQL> insert into t1 values('达梦数据');
insert into t1 values('达梦数据');
[-6169]:列[name]长度超出定义.
已用时间: 0.666(毫秒). 执行号:0.

初步猜想还是和LENGTH_IN_CHAR参数有关,VARCHAR类型可以受益于LENGTH_IN_CHAR参数的“放大效应”,LENGTH_IN_CHAR = 1 (以字符为单位),因为VARCHAR(4)能存入4个汉字,说明其长度是按字符数计算的。CHAR是定长类型,其长度语义不受LENGTH_IN_CHAR参数的“放大效应”影响,严格按照字节数来定义长度。
但是还是不清楚,为什么 CHAR 不受 LENGTH_IN_CHAR = 1 参数控制?

解决方案

DTS迁移过程中,将CHAR类型转换为VARCHAR类型,或者适当扩大列长度。

重新迁移这张表
上一步
图片.png
图片.png
图片.png
选择:如果目标表已存在,先删除
但实际测试,即使勾选了这个选项,目标表还是不会自动删除,需要人为先手动在目标库执行删除。
图片.png
转换
图片.png
将char(4)改成varchar,默认长度50。
图片.png
图片.png
图片.png
迁移成功。
图片.png

验证:

SQL> select * from t1;

行号     ID          NAME        
---------- ----------- ------------
1          1           国产数据

已用时间: 0.766(毫秒). 执行号:1106.

SQL> desc t1;

行号     name type$       nullable
---------- ---- ----------- --------
1          ID   INTEGER     Y
2          NAME VARCHAR(50) Y

已用时间: 1.034(毫秒). 执行号:1107.

欢迎关注我的公众号《IT小Chen

最后修改时间:2026-04-20 10:03:30
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论