将UTF-8编码的字符串插入到UTF-8编码的MySQL表中时,出现“Incorrect string value”错误。
将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”的错误。
问题的原因是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"错误。
在这个问题中,出现了“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是否必要呢?
在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字符。