You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MariaDB导入SQL文件报ERROR 1366(22007)字符串值错误如何解决

问题描述

向已创建完成的空数据库导入SQL文件时出现如下报错:

ERROR 1366 (22007) at line 19669: Incorrect string value: '\x92t' for column glen_wazzup.nuke_bbsearch_wordlist.word_text at 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 '',
    
    替换为:
    `word_text` varchar(50) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL default '',
    
    修改后该字段会按latin1单字节规则存储数据,不会做utf8mb4编码合法性校验,0x92字节可以正常写入,且原有数据的字节内容完全不会被改动,不会破坏原有搜索匹配逻辑。
  • 方案2:修改导入会话的字符集配置
    不需要改动建表语句,直接在SQL文件最顶部、所有其他语句之前加一行配置:
    SET NAMES latin1;
    
    这行配置会将整个导入会话的连接字符集设置为latin1,全程不会对插入的二进制值做utf8mb4编码校验,可直接完成全量导入。

注意:不要手动将0x92替换为utf8编码的撇号字符,会修改原始存储的字节内容,导致旧版phpBB的搜索匹配逻辑失效。

内容的提问来源于stack exchange,提问作者J. Scott Elblein

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 10:48:15