【发布时间】:2012-08-09 20:07:33
【问题描述】:
将 UTF-8 编码的字符串插入 UTF-8 编码的表会给出不正确的字符串值。
PDOException: SQLSTATE[HY000]: 一般错误: 1366 不正确的字符串值: '\xF0\x9D\x84\x8E i...' 列 'body_value' 在第 1 行: INSERT INTO
我有一个???? 字符,在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: 数据在两个表上非规范化:
SELECT character_set_name FROM information_schema.
COLUMNSC WHERE table_schema = "[database]" AND table_name IN ("field_data_body", "field_revision_body") AND column_name = "body_value";
>+--------------------+
| character_set_name |
+--------------------+
| utf8 |
| utf8 |
+--------------------+
编辑 4: 这个角色有可能是“新人”吗?我对the relationship between unicode and UTF-8 有点模糊,但这个wikipedia article 暗示这个字符是最近才标准化的。
我不明白为什么会因为“字符串值不正确”而失败。
【问题讨论】:
-
该表上的字段是否使用 UTF-8 字符集定义?
-
SELECT character_set_name FROM information_schema.`COLUMNS` C WHERE table_schema = "db_name" AND table_name = "table_name" AND column_name = "column_name";提供了什么 -
MySQL 的
utf8只是 BMP。它的utf8mb4对应外界的UTF-8(包含4字节字符)。 -
该错误是由于试图将 4 个字节塞进一个无法处理的字符集(即 MySQL 的“utf8”)。