我正在尝试在我的 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
中编码。但是,当我尝试将推文存储在该列中时,我收到以下错误消息:
不正确的字符串值:第 1 行的列 'tweet_text' 的 '\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;
utf8mb4
?
我终于能够弄清楚这个问题。我不得不更改mysql配置my.ini中的一些设置这篇文章帮助很大http://mathiasbynens.be/notes/mysql-utf8mb4#character-sets
首先我将 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
编码不兼容。所以对于某些应用程序来说,改变表/列编码是不够的。我不得不更改应用配置中的编码。
Redmine(红宝石,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
作为列/表编码并且仍然出现此类错误,请确保您已为应用程序中的数据库连接配置正确的字符集。
更改数据库字符集和排序规则
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语句,表的默认charset已经是utf8mb4了。看来您的连接字符集错误。
在 Java 中,像这样设置数据源 url:
jdbc:mysql://127.0.0.1:3306/testdb?useUnicode=true&characterEncoding=utf-8`.
?useUnicode=true&characterEncoding=utf-8
是使用 utf8mb4 所必需的。
它适用于我的应用程序。
utf-8
,但有些只理解 utf8
,在我的情况下,使用 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.