MariaDB导入SQL文件报ERROR 1366(22007)字符串值错误如何解决
问题描述
向已创建完成的空数据库导入SQL文件时出现如下报错:
ERROR 1366 (22007) at line 19669: Incorrect string value: '\x92t' for column
glen_wazzup.nuke_bbsearch_wordlist.word_textat row 1
环境信息
Server version: 10.8.3-MariaDB Server charset: UTF-8 Unicode (utf8mb4) Storage engine: InnoDB
关联表结构
报错涉及的nuke_bbsearch_wordlist表建表SQL如下:
CREATE TABLE `nuke_bbsearch_wordlist` ( `word_text` varchar(50) binary NOT NULL default '', `word_id` mediumint(8) unsigned NOT NULL auto_increment, `word_common` tinyint(1) unsigned NOT NULL default '0', PRIMARY KEY (`word_text`), KEY `word_id` (`word_id`) ) ENGINE=InnoDB AUTO_INCREMENT=18719 ;
报错对应语句
SQL文件第19669行的执行语句为:
INSERT INTO `nuke_bbsearch_wordlist` VALUES (0x6469646e9274, 6895, 0);
问题根因
报错核心是编码校验规则不匹配:varchar(50) binary类型默认继承数据库的utf8mb4字符集做写入合法性校验,但插入值里的0x92是Windows-1252编码的右单撇号字节,不属于合法的utf8mb4编码序列,因此被数据库拦截。这类数据是旧版phpBB搜索词表的典型存储格式,原本是按单字节二进制规则存储的,没有做utf8编码转换。
解决方案(直接修改原始SQL文件即可,无需建表后执行ALTER)
两种方案选任意一种都可以正常导入:
- 方案1:修改建表语句的字段字符集配置
将word_text字段的原定义:
替换为:`word_text` varchar(50) binary NOT NULL default '',
修改后该字段会按latin1单字节规则存储数据,不会做utf8mb4编码合法性校验,`word_text` varchar(50) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL default '',0x92字节可以正常写入,且原有数据的字节内容完全不会被改动,不会破坏原有搜索匹配逻辑。 - 方案2:修改导入会话的字符集配置
不需要改动建表语句,直接在SQL文件最顶部、所有其他语句之前加一行配置:
这行配置会将整个导入会话的连接字符集设置为latin1,全程不会对插入的二进制值做utf8mb4编码校验,可直接完成全量导入。SET NAMES latin1;
注意:不要手动将0x92替换为utf8编码的撇号字符,会修改原始存储的字节内容,导致旧版phpBB的搜索匹配逻辑失效。
内容的提问来源于stack exchange,提问作者J. Scott Elblein
相关产品推荐
相关产品推荐

