字符串值不正确:'\ xF0 \ x9F \ x8E \ xB6 \ xF0 \ x9F ...'MySQL

时间:2013-12-05 21:46:03

标签: mysql twitter utf-8 emoticons

我正在尝试在我的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;

7 个答案:

答案 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 utf8utf8mb4编码不兼容,但令我惊讶的是。因此,对于某些应用程序,更改表/列编码是不够的。我必须在应用程序配置中更改编码。

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.

enter link description here

答案 6 :(得分:0)

我在字符串中使用了表情符号,这是导致此错误的原因。

所以请确保您没有使用一些错误的字符串,这些字符串对于保存到数据库中是无效的。