小编典典

将UTF-8编码的字符串插入UTF-8编码的mysql表失败,并显示“字符串值不正确”

mysql

将UTF-8编码的字符串插入UTF-8编码的表中会给出错误的字符串值。

PDOException:SQLSTATE [HY000]:常规错误:1366错误的字符串值:第1行的’body_value’列的’\ xF0 \
x9D \ x84 \ x8E i …’

我有一个𝄎字符,在mb_detect_encoding声称为UTF-8编码的字符串中。我尝试将此字符串插入MySQL表,该表定义为(除其他事项外)DEFAULT CHARSET=utf8

编辑: Drupal总是SET NAMES utf8与可选COLLATE(与MySQL交谈时至少)。

编辑2:
一些似乎相关的更多细节。我从PostgreSQL数据库中获取一些文本。我将其粘贴到对象上,使用mb_detect_encoding验证其为UTF-8,然后使用node_save将对象持久保存到数据库中。因此,尽管存在触发导入的HTTP请求,但数据并非来自浏览器。

编辑3: 在两个表上对数据进行非规范化:

从information_schema中选择character_set_name。COLUMNSC WHERE table_schema =“
[数据库]” AND table_name IN(“ field_data_body”,“ field_revision_body”)AND
column_name =“ body_value”;

>+--------------------+
| character_set_name |
+--------------------+
| utf8               |
| utf8               |
+--------------------+

编辑4:
角色是否可能是“新手”?我对unicode和UTF-8之间的关系有点模糊,但是这篇Wikipedia文章暗示该字符是最近才标准化的。

我不明白如何使用“不正确的字符串值”来失败。


阅读 346

收藏
2020-05-17

共1个答案

小编典典

𝄎(U + 1D10E)是在BMP(基本多语言平面)(U +
FFFF以上)之外找到的Unicode字符,因此不能以3字节的UTF-8形式表示。MySQL字符集utf8仅接受可以用3个字节表示的UTF-8字符。如果需要将其存储在MySQL中,则需要使用MySQL
charset utf8mb4。您将需要MySQL 5.5.3或更高版本。您可以使用ALTER
TABLE更改字符集,不会有太大问题。由于需要更多空间来存储字符,因此出现了一些问题,可能需要您减小字符串大小。参见http://dev.mysql.com/doc/refman/5.5/en/charset-
unicode-upgrading.html。

2020-05-17