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


69

我正在尝试在我的MYSQL表中存储一条推文。的鸣叫是:

quiero que me escuches,no te burles no te rias,anoche tuve unsueñoque 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;

9
您是否已将数据库连接的字符集设置为utf8mb4
eggyal 2013年

抱歉,数据库连接字符集是什么意思?数据库的字符集为utf8mb4,排序规则为utf8mb4_general_ci
db1

对于此推文,我也收到类似的错误消息twitter.com/OfficialMansi/status/406007380241969152推文结尾处带有笑脸。该错误消息是不正确的字符串值: '\ XF3 \ XBE \ x8D \ X83ħ...'在第1行的列'tweet_text'
DB1

1
如果没有其他效果,您介意只为该表发布“创建表”语句吗?
Danack 2013年

1
不是列的字符集,而是连接字符集!当您连接到数据库时,会有一个连接字符集,该字符集告诉数据库将以哪种编码发送数据以及期望返回哪种编码。您如何确切地连接到数据库?
deceze

Answers:


114

我终于能够找出问题所在。我必须在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%';

3
旁注:如果使用节点npm sequelize + MySQL,则需要以一种特殊的方式设置字符集,这至少对我来说似乎很古怪。github.com/sequelize/sequelize/issues/395
treejanitor

哦,我的上帝,:)非常感谢db1。经过大约12个小时的建议后。我刚刚在连接创建时在代码中执行了“设置名称utf8mb4”,然后一切正常。
epcpu

我执行了SET NAMES utf8mb4; 在插入之前进行查询,但是现在我无法从准备好的语句中获取新的插入ID。请为我建议解决方案
Onkar Musale,

我制作了一个脚本,该脚本将自动转换数据库中的所有表gist.github.com/pobegov/f8b293fb6eb658a13feb1c318e6c07ed
克隆

只是增加了理由-在MySQL中,UTF-8每个字符只能容纳3个字节。MySQL编码utf8mb4实际上是真正的4字节utf8编码。
Pankaj

18

我遇到了同样的问题,并了解到以下内容:

即使数据库具有默认字符集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;

14

这可能很明显,但是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使用列/表编码,但仍收到类似错误,请确保为应用程序中的数据库连接配置了正确的字符集。



8

更改数据库字符集和排序规则

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


4

根据create table语句,该表的默认字符集已经是utf8mb4。似乎您的连接字符集错误。

在Java中,像这样设置数据源网址:jdbc:mysql://127.0.0.1:3306 / testdb?useUnicode = true&characterEncoding = utf-8。

使用utf8mb4时需要“?useUnicode = true&characterEncoding = utf-8”。

它适用于我的应用程序。


这可行!也取决于客户端(例如某些客户端理解utf-8但有些客户端理解utf8,在我的情况下,utf8mb4用于char集有效)。
充满希望的

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.

在此处输入链接说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.