14

将 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:数据在两个表上非规范化:

从信息架构中选择字符集名称。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:这个角色有可能是“新人”吗?我对unicode 和 UTF-8 之间的关系有点模糊,但是这篇维基百科文章暗示该字符是最近才标准化的。

我不明白“字符串值不正确”怎么会失败。

4

4 回答 4

25

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

于 2012-08-14T08:29:30.057 回答
8

要解决此问题,首先将数据库字段更改为 utf8m4b 字符集。例如:

ALTER TABLE `tb_name` CHANGE `field_name` `field_name` VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL; 

然后在您的数据库连接中,将 driver_options 设置为 utf8mb4。例如,如果您使用 PDO

$db = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8mb4', 'username', 'password');

或在 zend 框架 1.2 中

$dbParam = array('host' => 'localhost', 'username' => 'db_user_name',
            'password' => 'password', 'dbname' => 'db_name',
            'driver_options' => array(
                '1002' => "SET NAMES 'utf8mb4'",
                '12'    => 0 //this is not necessary
            )
        );
于 2016-03-29T02:54:32.317 回答
4

在您的 PDO 连接中,设置字符集。

new PDO('mysql:host=localhost;dbname=the_db;charset=utf8mb4', $user, $password);
于 2012-08-13T15:08:38.853 回答
3

我修复了错误:SQLSTATE[HY000]: General error: 1366 Incorrect string value ...... 用这个方法:

我为数据库使用 utf8mb4_unicode_ci 数据库 为所有表设置 utf8mb4_unicode_ci 表

为列设置长博客数据类型(不是文本,长文本......您需要大数据类型来存储 4 个字节的内容) 字段

现在好了。如果你使用 laravel,继续编辑 config/database.php

'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',

拉拉维尔

如果您使用函数 strtolower,请将其替换为 mb_strtolower 注意:您必须戴上<meta charset="utf-8">head 标签

于 2019-08-28T04:22:22.927 回答