将UTF-8编码的字符串插入到UTF-8编码的MySQL表中时,出现“Incorrect string value”错误。

14 浏览
0 Comments

将UTF-8编码的字符串插入到UTF-8编码的MySQL表中时,出现“Incorrect string value”错误。

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

PDOException:SQLSTATE[HY000]:通用错误:1366列'body_value'的字符串值不正确:INSERT INTO

我有一个𝄎字符,字符串中mb_detect_encoding声称其为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:可能这个字符是“最新的”吗?我对unicode和UTF-8之间的关系不太清楚,但这个维基百科文章暗示该字符是最近标准化的。

我不明白为什么会出现“Incorrect string value”的错误。

0
0 Comments

问题的原因是MySQL表中的字符集和插入的字符串的字符集不匹配。解决方法是在PDO连接中设置字符集为utf8mb4,并确保插入的字符串也是使用UTF-8编码。

在PDO连接中,设置字符集为utf8mb4:

new PDO('mysql:host=localhost;dbname=the_db;charset=utf8mb4', $user, $password);

在HTML头部添加字符集信息:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

确保使用utf8mb4而不是utf8字符集。

通过以上步骤,可以解决将UTF-8编码的字符串插入到UTF-8编码的MySQL表时出现的"Incorrect string value"错误。

0
0 Comments

在这个问题中,出现了“Incorrect string value”错误。出现这个错误的原因是因为将UTF-8编码的字符串插入到UTF-8编码的mysql表中。

为了解决这个问题,首先需要将数据库字段更改为utf8mb4字符集。例如:

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 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 //this is not necessary
            )
        );

这里的1002和12代表什么呢?

它们是PDO mysql中driver_options的选项。您可以在这里了解更多细节:php.net/manual/en/ref.pdo-mysql.php

PDO::MYSQL_ATTR_INIT_COMMAND (1002)和PDO::FETCH_KEY_PAIR (12)。在与问题相关的情况下,FETCH_KEY_PAIR是否必要呢?

0
0 Comments

在MySQL中,当将UTF-8编码的字符串插入到UTF-8编码的表中时,可能会出现"Incorrect string value"的错误。这是因为𝄎(U+1D10E)是一种位于BMP(基本多语言平面)之外(超过U+FFFF)的Unicode字符,因此无法用3个字节的UTF-8表示。MySQL字符集utf8只接受能够用3个字节表示的UTF-8字符。如果需要将其存储在MySQL中,需要使用MySQL字符集utf8mb4,需要MySQL 5.5.3或更高版本。

可以使用ALTER TABLE命令在不引起太多问题的情况下更改字符集;由于需要更多的空间来存储字符,可能会出现一些问题,可能需要减少字符串的大小。

对于旧版本的MySQL是否有解决方案呢?如果他可以更改数据库,那么相比使用Postgresql,升级MySQL应该更容易。

需要注意的是,5.5.3是引入utf8mb4的版本,很抱歉,没有其他方式可以存储4字节UTF-8(非BMP)字符。

对于保存字符串之前,我认为我最终是将所有4字节UTF-8替换为它们的HTML字符来解决这个问题。

总结起来,要解决"Inserting UTF-8 encoded string into UTF-8 encoded mysql table fails with "Incorrect string value""的问题,需要将MySQL字符集改为utf8mb4,并确保使用的MySQL版本为5.5.3或更高版本。还可以通过ALTER TABLE命令修改表的字符集,但需要注意可能需要减少字符串的大小。对于旧版本的MySQL,可以考虑升级数据库或使用其他解决方案,如将4字节UTF-8替换为HTML字符。

0