batch insert 导入带 emoji 的数据到使用 utf8mb4 的表中报错

Bug 反馈

【 Bug 的影响】

  • 无法使用 DM 工具进行迁移正常的 utf8mb4 数据
  • 无法使用 mysql client 进行带 utf8mb4 数据的 SQL 文件导入
  • 无法在mysql shell内使用source命令进行批量插入
  • 在 MySQL shell 内直接执行 SQL 语句,可以插入

【可能的问题复现步骤】

  • 准备一张 utf8mb4 的表结构
  • 好带有 utf8mb4 的数据,如带有 emoji 表情的行数据
  • 使用批量导入失败

【看到的非预期行为】

dm 无法导入,报错

ERROR 1366 (HY000) at line 1: incorrect utf8 value e5a5a5e69cafe5a4a9f09f9883f09f9883f09f9184eda0bd(奥术天:smiley::smiley::lips:���) for column name

【期望看到的行为】

正常能够录入 utf8mb4 数据

【相关组件及具体版本】

  • 版本: 5.1.0 & 5.0.3 & 5.0.2 都有这个问题

【其他背景信息或者截图】

DM 报错截图:

其他操作报错截图:

再附上 MySQL 状态截图

1 个赞

辛苦看下tidb端的表结构,反馈下

已经在截图中

我把表结构直接贴出来文本吧:

*************************** 1. row ***************************
       Table: game_character
Create Table: CREATE TABLE `game_character` (
  `_id` bigint(20) unsigned NOT NULL,
  `uid` bigint(20) unsigned NOT NULL,
  `gid` bigint(20) unsigned NOT NULL,
  `gtype` int(10) unsigned NOT NULL,
  `name` varchar(32) NOT NULL,
  `tCreate` bigint(20) NOT NULL DEFAULT '0',
  `in_use` tinyint(1) NOT NULL DEFAULT '1',
  `tDelete` bigint(20) unsigned NOT NULL DEFAULT '0',
  UNIQUE KEY `uni_gid_gtype_name` (`gid`,`gtype`,`name`),
  KEY `uid_gid` (`uid`,`gid`),
  KEY `_id` (`_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin

稍等,我稍后测试下,可能会比较晚,今天公司事情比较多,请问你这是正式环境么,你这比较紧急么,另外可以把你那条insert粘贴出来么,最好还有dm的配置,我这看看是否能复现,把敏感的信息剔除掉

不急的,不是正式环境,就是在做一些数据迁移

补充下背景:

dm 迁移的时候没有配置跳过utf8 check, 附图上的全程测试也没有设置这个 utf8 check 跳过

tidb_skip_utf8_check 

好的。我这边看看能否复现。

抱歉这么晚才回复,我这做了下测试是可以成功的,可以把任务的配置文件发下么,把ip之类的敏感信息去掉
image

感谢支持~~

今天发现原来不是 emoji 的问题,是我们导入这些数据里面,有几个无法识别的 utf8 coding:

\ufffd,具体来说就是这个� ,导致触发了 tidb 的 utf8 check,其实并非不支持 emoji

官方排错文档有说:https://docs.pingcap.com/tidb/stable/tidb-troubleshooting-map#62-data-migration

另外参考一篇 blog 也有提到:https://izualzhy.cn/interesting-encode,\ufffd这个非常常见,是无法转换的时候就会转成这个编码的。

目前的疑点就剩一个:在 shell 里面直接执行 INSERT SQL Query,是可以成功的,没有触发检查。

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。