我正在尝试在我的MYSQL表中存储推文。 tweet是:
quiero que me escuches,no te burles no te rias,anoche tuveunueñoquete fuiste de mi vida??
最后两个字符都是'MULTIPLE MUSICAL NOTES' (U+1F3B6),UTF-8编码为0xf09f8eb6
。
我的表格中的tweet_text
字段以utf8mb4
编码。但是当我尝试将推文存储在该列中时,我收到以下错误消息:
字符串值不正确:'\ xF0 \ x9F \ x8E \ xB6 \ xF0 \ x9F ...'代表第1行的'tweet_text'列。
出了什么问题?我怎样才能解决这个问题?我还需要存储多种语言,这个字符集适用于所有语言,但不适用于表情符号和表情符号等特殊字符。
这是我的create table语句:
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;
答案 0 :(得分:79)
我终于弄明白了这个问题。 我不得不在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%';
答案 1 :(得分:12)
我遇到了同样的问题并学习了以下内容 -
即使数据库的默认字符集为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;
答案 2 :(得分:4)
很明显,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
作为列/表编码,但仍收到类似错误,请确保已为应用程序中的数据库连接配置了正确的字符集。
答案 3 :(得分:2)
根据create table语句,该表的默认字符集已经是utf8mb4。似乎您的连接字符集错误。
在Java中,像这样设置数据源URL:jdbc:mysql://127.0.0.1:3306 / testdb?useUnicode = true&characterEncoding = utf-8。
使用utf8mb4需要“?useUnicode = true&characterEncoding = utf-8”。
它适用于我的应用程序。
答案 4 :(得分:1)
摘自本文https://hackernoon.com/today-i-learned-storing-emoji-to-mysql-with-golang-204a093454b7
更改数据库字符集和排序规则
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
答案 5 :(得分:0)
用于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.
答案 6 :(得分:0)
我在字符串中使用了表情符号,这是导致此错误的原因。
所以请确保您没有使用一些错误的字符串,这些字符串对于保存到数据库中是无效的。