将UTF-8编码的字符串插入UTF-8编码表会产生不正确的字符串值.
PDOException:SQLSTATE [HY000]:常规错误:1366字符串值不正确:'\ xF0\x9D\x84\x8E i ...'第1行的列'body_value':INSERT INTO
我有一个 character, in a string that mb_detect_encoding claims is UTF-8 encoded.
I try to insert this string into a MySQL table, which is defined as (among other things) 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 |
+--------------------+
Run Code Online (Sandbox Code Playgroud)
编辑4:这个角色可能是"新的"吗?我对unicode和UTF-8之间的关系有点模糊,但这篇维基百科文章暗示这个角色最近已经标准化了.
我不明白如何使用"不正确的字符串值"失败.
pro*_*aes 17
(U + 1D10E)是在BMP(基本多语言平面)之外找到的字符Unicode(在U + FFFF之上),因此不能以3字节的UTF-8表示.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.
要解决此问题,首先将数据库字段更改为utf8m4b字符集。例如:
ALTER TABLE `tb_name` CHANGE `field_name` `field_name` VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL;
Run Code Online (Sandbox Code Playgroud)
然后在您的数据库连接中,将其driver_options设置为utf8mb4。例如,如果您使用PDO
$db = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8mb4', 'username', 'password');
Run Code Online (Sandbox Code Playgroud)
或在zend Framework 1.2中
$dbParam = array('host' => 'localhost', 'username' => 'db_user_name',
'password' => 'password', 'dbname' => 'db_name',
'driver_options' => array(
'1002' => "SET NAMES 'utf8mb4'",
'12' => 0
)
);
Run Code Online (Sandbox Code Playgroud)