php - 将 UTF-8 编码的字符串插入 UTF-8 编码的 mysql 表失败​​,并显示 "Incorrect string value"

标签 php mysql drupal

将 UTF-8 编码的字符串插入到 UTF-8 编码的表中会得到不正确的字符串值。

PDOException: SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xF0\x9D\x84\x8E i...' for column 'body_value' at row 1: INSERT INTO

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

编辑:Drupal 始终使用可选的COLLATE 执行SET NAMES utf8(至少在与MySQL 对话时)。

编辑 2:一些看起来相关的更多细节。我从 PostgreSQL 数据库中获取了一些文本。我将它粘贴到一个对象上,使用 mb_detect_encoding 来验证它是 UTF-8,然后使用 node_save 将该对象保存到数据库中。 .因此,虽然存在触发导入的 HTTP 请求,但数据并非来自浏览器。

编辑 3:数据在两个表上被非规范化:

SELECT character_set_name FROM information_schema.COLUMNS C 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 , 表示该字符最近才被标准化。

我不明白为什么会因“不正确的字符串值”而失败。

最佳答案

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

关于php - 将 UTF-8 编码的字符串插入 UTF-8 编码的 mysql 表失败​​,并显示 "Incorrect string value",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11936950/

相关文章:

php - 尝试扩展类(class)时出现奇怪的警告

javascript - 为什么我的 ajax 代码实际上没有发送?

mysql - 如何在mysql表中重复序列号

php - 无法理解 0 行在 php/mysql 中返回

php - 如何使用android设备将数据插入mysql?

mysql - InnoDB MySQL 5.5 中的 TEXT 与 VARCHAR。何时使用每一个

php - Drupal 6 表单通过数据库查询进行迭代

ruby-on-rails - Drupal 没有 "Community Plumbing"了?我的下一步发展该怎么做?

drupal - 多种语言的多个首页

javascript - ajax 中的 Laravel Blade 状况