作者: longzhuquan
背景
某去O场景业务上线测试,再执行某张表缩字段时报错。
现象
执行缩字段语句
ALTER TABLE schemaname.tablename MODIFY COLUMN licenseno varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL COMMENT '发动机号' ;
报错信息
"incorrect string value '\xED' for column ‘licenseno’"
数据库版本
推测原因
TiDB报错"incorrect string value '\xED' for column ‘licenseno’",一般来说此类报错出现在插入语句阶段,用户在插入与字符集集不匹配的非法字符时报错。而题主本次进行进行的缩字段语句,其原理操作步骤大致分为:将相关表数据由 KV 全部 LOAD 到 TIDB 内存中,在内存中进行修改数据,将修改完的数据进行合规性校验,检验完成后回填到 KV 中。
所以推测是在数据回填进行合法性校验时出现了错误。
查看数据库字符集
character_set_client utf8mb4
character_set_connection utf8mb4
character_set_database utf8mb4
character_set_filesystem binary
character_set_results
character_set_server utf8mb4
character_set_system utf8
character_sets_dir /usr/local/mysql-5.6.25-osx10.8-x86_64/share/charsets/
查询原表中是否含有非法字符
select _tidb_rowid, convert(a using utf8mb4) from table where convert(a using utf8mb4) != a;
经过排查发现 “licenseno” 是一个车牌号,其字段类型为 “varchar(200)”,而表中确实存在非法字符,其中此字段的值为 “
标签:set,生僻字,utf8mb4,导出,转码,character,乱码,16,TiDB From: https://blog.51cto.com/u_15550868/7201165