SQL Server nvarchar(255)转MariaDB varchar遇CData Sync报错求解
解决CData Sync迁移SQL Server到MariaDB的1170错误
结论先行
把SQL Server的nvarchar(255)直接映射为MariaDB的varchar(255)即可解决问题,不要用varchar(512)。
问题根源
SQL Server的nvarchar是双字节存储,255个字符占510字节,但CData Sync默认会把这个字节数直接转成varchar的长度(即varchar(510))。而MariaDB中,当varchar的实际字节长度超过存储引擎的索引限制(比如InnoDB默认767字节),会被自动识别为TEXT/BLOB类型;这类类型作为主键必须指定长度,所以触发#1170 error (42000)。
具体操作步骤
- 打开CData Sync的表映射界面,定位到报错的列(包括主键列)。
- 将目标列的数据类型从自动生成的
varchar(510)手动修改为varchar(255)。 - 保存映射配置后重新执行迁移任务。
额外注意(针对utf8mb4字符集)
如果你的MariaDB使用utf8mb4字符集(支持emoji等全Unicode字符),varchar(255)的字节长度是255×4=1020,超过InnoDB默认的767字节索引限制,这时候可以二选一:
- 开启InnoDB大前缀支持:执行
SET GLOBAL innodb_large_prefix = ON;,然后重启MariaDB(或者修改my.cnf配置文件永久生效),此时索引长度限制提升到3072字节,varchar(255)可正常作为主键。 - 把列长度调整为
varchar(191),191×4=764,刚好卡在默认索引限制内。
内容的提问来源于stack exchange,提问作者stackoverflowme
相关产品推荐
相关产品推荐

