我正试图在MYSQL表中存储一条tweet。推特是:
quiero que me escuches,no te burles no te rias,anoche tuve un sueño que te fuiste de mi vida🎶;
最后两个字符都是"MULTIPLE MUSICAL NOTES"(U+1F3B6),UTF-8编码为0xf09f8eb6
。
我的表中的tweet_text
字段是用utf8mb4
编码的。但当我试图将推文存储在该列中时,我会收到以下错误消息:
字符串值不正确:'\xF0\x9F\x8E\xB6\xF0\x9kF…'第1行的"tweet_text"列。
出了什么问题?我该怎么解决这个问题?我还需要存储多种语言,这个字符集适用于所有语言,但不适用于表情符号和表情符号等特殊字符。
这是我的创建表语句:
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配置my.ini中的一些设置这篇文章帮助很大http://mathiasbynens.be/notes/mysql-utf8mb4#character-设置
首先,我将my.ini中的字符集更改为utf8mb4接下来,我在mysql客户端中运行以下命令
SET NAMES utf8mb4;
ALTER DATABASE dreams_twitter CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;
使用以下命令检查是否进行了更改
SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';
我遇到了同样的问题,并学会了以下内容-
尽管数据库的默认字符集为utf-8,但在MySQL中,数据库列也可能有不同的字符集。将dB和有问题的列修改为UTF-8:
mysql> ALTER DATABASE MyDB CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci'
mysql> ALTER TABLE database.table MODIFY COLUMN column_name VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;
现在使用创建新表
> CREATE TABLE My_Table_Name (
twitter_id_str VARCHAR(255) NOT NULL UNIQUE,
twitter_screen_name VARCHAR(512) CHARACTER SET utf8 COLLATE utf8_unicode_ci,
.....
) CHARACTER SET utf8 COLLATE utf8_unicode_ci;
SET NAMES utf8
与utf8mb4
编码不兼容,这可能是显而易见的,但我仍然感到惊讶。因此,对于一些应用程序来说,仅仅更改表/列编码是不够的。我不得不更改应用程序配置中的编码。
红矿(红宝石,ROR)
在config/database.yml
:中
production:
adapter: mysql2
database: redmine
host: localhost
username: redmine
password: passowrd
encoding: utf8mb4
自定义Yii应用程序(PHP)
在config/db.php
:中
return [
'class' => yiidbConnection::class,
'dsn' => 'mysql:host=localhost;dbname=yii',
'username' => 'yii',
'password' => 'password',
'charset' => 'utf8mb4',
],
如果您将utf8mb4
作为列/表编码,但仍然会出现这样的错误,请确保在应用程序中为DB连接配置了正确的字符集。
更改数据库字符集和排序规则
ALTER DATABASE
database_name
CHARACTER SET = utf8mb4
COLLATE = utf8mb4_unicode_ci;
更改特定表的字符集和排序规则
ALTER TABLE
table_name
CONVERT TO CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
更改mysql驱动程序中的连接字符集
之前
charset=utf8&parseTime=True&loc=Local
之后
charset=utf8mb4&collation=utf8mb4_unicode_ci&parseTime=True&loc=Local
来自本文https://hackernoon.com/today-i-learned-storing-emoji-to-mysql-with-golang-204a093454b7
根据create table语句,表的默认字符集已经是utf8mb4。看来你的连接字符集不对。
在Java中,设置数据源url如下:
jdbc:mysql://127.0.0.1:3306/testdb?useUnicode=true&characterEncoding=utf-8`.
CCD_ 9是使用utf8mb4所必需的。
它适用于我的应用程序。
对于SQLALCHEMY和PYTHON
Unicode使用的编码传统上是"utf8"。然而,对于正向的MySQL版本5.5.3,引入了新的MySQL特定编码"utf8mb4",从MySQL 8.0开始,如果在任何服务器端指令中指定了纯utf8,则服务器会发出警告,并用utf8mb3替换。这种新编码的基本原理是MySQL的传统utf-8编码只支持最多三个字节的代码点,而不是四个字节。因此,当与包含大小超过三个字节的代码点的MySQL数据库通信时,如果数据库和客户端DBAPI都支持,则首选此新字符集,如:
e = create_engine(
"mysql+pymysql://scott:tiger@localhost/test?charset=utf8mb4")
All modern DBAPIs should support the utf8mb4 charset.
在此处输入链接描述
我在字符串中使用了表情符号,这是导致此错误的原因。
因此,请确保您没有使用某些不正确的字符串,这些字符串无法保存到数据库中。
正如其他人所说,这是因为您试图将4字节的数据保存到更小的空间中。
如果您在java中面临类似的问题,并且没有灵活性来更改数据库的字符集和整理编码,那么这个答案就适合您了。
您可以使用表情符号Java库来实现相同的功能。您可以在保存/更新到数据库之前转换为别名,并在从数据库保存/更新/加载后转换回unicode。主要的好处是即使在编码后文本的可读性,因为这个库只别名表情符号,而不是整个字符串。
我更改了MySQL设置,但仍然不变。最后,我在插入之前对字符串使用了函数utf8_decode()。