不正确的字符串值:列的 '\\xA0Consu...' 即使列具有 utf8mb4 编码
Incorrect string value: '\\xA0Consu...' for column even though column has utf8mb4 encoding
我是 运行 python 在 table 中插入记录的脚本。我正在从包含带有特殊字符的单元格的电子表格中读取数据。
在我的脚本中,我在执行以下命令之前运行遵循命令:
SET NAMES utf8mb4;
SET CHARACTER SET utf8mb4;
SET character_set_connection=utf8mb4;
SET collation_connection = utf8mb4_unicode_ci;
这是我的 table 结构:
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;
Table编码:UTF8MB4
Table 整理:UTF8MB4_UNICODE_CI
环境变量:
显示像“%collation%”这样的变量;
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")
预期结果是应将行插入数据库。
这表示客户端中的编码是 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
(硬space),那么客户端中的整个文本也必须是latin1,而且你必须说SET NAMES latin1
(或者... -- 有几种方法可以做到这一点)。
如果你不关心你使用什么类型的space,那么使用一个简单的space。
如果客户端的其余部分使用 UTF-8,而您想要 "non-breaking space",则使用 \xc2a0
(UTF-8 编码)。
我是 运行 python 在 table 中插入记录的脚本。我正在从包含带有特殊字符的单元格的电子表格中读取数据。
在我的脚本中,我在执行以下命令之前运行遵循命令:
SET NAMES utf8mb4;
SET CHARACTER SET utf8mb4;
SET character_set_connection=utf8mb4;
SET collation_connection = utf8mb4_unicode_ci;
这是我的 table 结构:
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;
Table编码:UTF8MB4 Table 整理:UTF8MB4_UNICODE_CI
环境变量:
显示像“%collation%”这样的变量;
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")
预期结果是应将行插入数据库。
这表示客户端中的编码是 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
(硬space),那么客户端中的整个文本也必须是latin1,而且你必须说SET NAMES latin1
(或者... -- 有几种方法可以做到这一点)。
如果你不关心你使用什么类型的space,那么使用一个简单的space。
如果客户端的其余部分使用 UTF-8,而您想要 "non-breaking space",则使用 \xc2a0
(UTF-8 编码)。