错误的字符串值:'\xF0\x9F\x8E\xB6\xF0\x9F...' MySQL
错误的字符串值:'\xF0\x9F\x8E\xB6\xF0\x9F...' MySQL
我正在尝试将一条推文存储在我的MYSQL表中。这条推文的内容是:tweet:
quiero que me escuches, no te burles no te rias, anoche tuve un sueño que te fuiste de mi vida
最后两个字符都是'多个音符' (U+1F3B6),其UTF-8编码为0xf09f8eb6
。
我表中的tweet_text
字段使用utf8mb4
编码。但是当我尝试将推文存储在该列中时,出现以下错误消息:
Column 'tweet_text' at row 1 has an incorrect value: '\xF0\x9F\x8E\xB6\xF0\x9F...'.
出了什么问题?我该如何解决?我需要存储多种语言,而这个字符集对于所有语言都有效,但对于像表情符号和表情这样的特殊字符无效。
这是我的创建表语句:
CREATE TABLE `twitter_status_data` ( `unique_status_id` bigint(20) NOT NULL AUTO_INCREMENT, `metadata_result_type` text CHARACTER SET utf8, `created_at` text CHARACTER SET utf8 NOT NULL COMMENT 'UTC time when this Tweet was created.', `id` bigint(20) unsigned NOT NULL COMMENT 'Unique tweet identifier', `id_str` text CHARACTER SET utf8 NOT NULL, `tweet_text` text COMMENT 'Actual UTF-8 text', `user_id_str` text CHARACTER SET utf8, `user_name` text COMMENT 'User''s name', `user_screen_name` text COMMENT 'Twitter handle', `coordinates` text CHARACTER SET utf8, PRIMARY KEY (`unique_status_id`), KEY `user_id_index` (`user_id`), FULLTEXT KEY `tweet_text_index` (`tweet_text`) ) ENGINE=InnoDB AUTO_INCREMENT=82451 DEFAULT CHARSET=utf8mb4;
在MySQL中出现“Incorrect string value: '\xF0\x9F\x8E\xB6\xF0\x9F...'”的问题,其原因是由于SET NAMES utf8
与utf8mb4
编码不兼容。因此,在某些应用程序中,仅仅改变表/列的编码是不够的,还需要在应用程序配置中更改编码。
对于Redmine(ruby, ROR),在config/database.yml
中进行如下修改:
production:
adapter: mysql2
database: redmine
host: localhost
username: redmine
password: passowrd
encoding: utf8mb4
对于自定义的Yii应用程序(PHP),在config/db.php
中进行如下修改:
return [ 'class' => yii\db\Connection::class, 'dsn' => 'mysql:host=localhost;dbname=yii', 'username' => 'yii', 'password' => 'password', 'charset' => 'utf8mb4', ],
如果你的列/表编码为utf8mb4
,但仍然出现类似错误的问题,请确保在应用程序中为数据库连接配置了正确的字符集。
对于Redmine,当配置应用程序时已存在的数据库时,可能无法正常工作,因此可以使用迁移代码修复,参考链接:redmine.org/issues/21398
感谢发布的Yii解决方案,它起到了作用。
最近我遇到了一个问题,当我尝试在MySQL中插入一些特殊字符时,出现了一个错误。错误信息是"Incorrect string value: '\xF0\x9F\x8E\xB6\xF0\x9F...' MySQL"。经过一番调查,我终于找到了问题的原因和解决方法。
问题的原因是MySQL默认的字符集只能存储3个字节的UTF-8字符,而我尝试插入的字符是4个字节的UTF-8字符。因此,需要将MySQL的字符集设置为utf8mb4,以支持4个字节的字符。
解决方法如下:
1. 修改MySQL的配置文件my.ini,在其中将字符集设置为utf8mb4。
2. 在MySQL客户端中运行以下命令,以确保更改生效:
SET NAMES utf8mb4;
ALTER DATABASE dreams_twitter CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;
3. 使用以下命令检查更改是否生效:
SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
另外,如果您使用的是node npm sequelize + MySQL,需要以特殊的方式设置字符集。您可以参考这个链接了解更多信息。
最后,我还发现在插入数据时执行SET NAMES utf8mb4;
命令后,无法获取预处理语句的新插入ID。如果您遇到了同样的问题,可以尝试其他解决方案。
总结一下,这个问题的原因是MySQL默认字符集不支持4个字节的UTF-8字符。要解决这个问题,我们需要将MySQL的字符集设置为utf8mb4,并在插入数据时执行SET NAMES utf8mb4;
命令。希望这篇文章对你有所帮助!