不正确的字符串值:列的“\\xA0Consu ...”即使列具有 utf8mb4 编码

Posted

技术标签:

【中文标题】不正确的字符串值:列的“\\\\xA0Consu ...”即使列具有 utf8mb4 编码【英文标题】:Incorrect string value: '\\xA0Consu...' for column even though column has utf8mb4 encoding不正确的字符串值:列的“\\xA0Consu ...”即使列具有 utf8mb4 编码 【发布时间】:2019-11-28 20:32:44 【问题描述】:

我正在运行 python 脚本在表中插入记录。我正在从包含带有特殊字符的单元格的电子表格中读取数据。

在我的脚本中,我在执行以下命令之前运行以下命令:

SET NAMES utf8mb4;
SET CHARACTER SET utf8mb4;
SET character_set_connection=utf8mb4;
SET collation_connection = utf8mb4_unicode_ci;

这是我的表结构:

CREATE TABLE `staging` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`d_date` date NOT NULL,
`m_date` date NOT NULL,
`market` varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'US',
`cola` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL,
`colb` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=265 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

表格编码:UTF8MB4 表排序:UTF8MB4_UNICODE_CI

环境变量:

显示像'%collat​​ion%'这样的变量;

collation_connection    latin1_swedish_ci
collation_database  utf8mb4_unicode_ci
collation_server    utf8mb4_unicode_ci

显示像'%char%'这样的变量;

character_set_client    latin1
character_set_connection    latin1
character_set_database  utf8mb4
character_set_filesystem    binary
character_set_results   latin1
character_set_server    utf8mb4
character_set_system    utf8
character_sets_dir  /usr/local/mysql-5.7.20-macos10.12-x86_64/share/charsets/

查询:

insert into staging (d_date, m_date, market, cola, colb ) 
values ('2019-07-18', '2019-07-01', 'US', 'ARCA', 'Sodius\xa0Consumer Auto');

错误:

_mysql_exceptions.OperationalError: (1366, "Incorrect string value: '\\xA0Consu...' for column 'colb' at row 1")

预期的结果是行应该被插入到数据库中。

【问题讨论】:

INSERT 语句中显示的字符串文字应该不会出错。反斜杠字符将被删除,因为它后面的字符没有形成有效的 MySQL 转义序列。 Sodiusxa0Con... (如果 sql_mode 包含 NO_BACKSLASH_ESCAPES 则反斜杠字符将被视为常规字符。)我怀疑问题中显示的带有字符串文字的 SQL 语句 not 是实际的正在执行的语句。 @spencer7593 是的,该查询不是精确查询。我已经从命令输出中复制了它。 实际单词是“Sodius¬†Consumer Auto” 【参考方案1】:

这表示客户端中的编码是UTF-8:SET NAMES utf8mb4;

这表示客户端中的编码是latin1:\xa0

这表示cola 将被编码为 UTF-8,无论客户端有什么:cola varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL

这些说你做了SET NAMES latin1:

character_set_client    latin1
character_set_connection    latin1
character_set_results   latin1

如果你真的想要\xA0(硬空格),那么客户端中的整个文本也必须是latin1,并且你必须说SET NAMES latin1(或者... -- 有几种方法可以做到这一点) .

如果您不在乎使用什么类型的空间,那就使用简单的空间。

如果客户端的其余部分使用 UTF-8,并且您想要一个“不间断空格”,则使用 \xc2a0(UTF-8 编码)。

【讨论】:

嗨瑞克,非常感谢您的回复。知道了。它现在正在工作。

以上是关于不正确的字符串值:列的“\\xA0Consu ...”即使列具有 utf8mb4 编码的主要内容,如果未能解决你的问题,请参考以下文章

日期时间格式无效:1366 字符串值不正确

设置 JTable 列的原型值(用于自动宽度计算)

将字符串插入 SQLAlchemy Unicode 列的正确方法

SQL:Null 列的计数不正确

Postgres 时间戳列的默认值设置未正确使用

如何正确使用表值函数?