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

问题描述 投票:0回答:10

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

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;
mysql twitter utf-8 emoticons
10个回答
146
投票

我终于能够弄清楚这个问题了。 我必须更改 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%';

23
投票

我遇到了同样的问题并学到了以下内容-

尽管数据库的默认字符集是 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;

21
投票

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

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


19
投票

这可能是显而易见的,但仍然令我惊讶的是,

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
作为列/表编码,但仍然遇到这样的错误,请确保您在应用程序中为数据库连接配置了正确的字符集。


8
投票

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

在 Java 中,像这样设置数据源 url:

jdbc:mysql://127.0.0.1:3306/testdb?useUnicode=true&characterEncoding=utf-8`.

?useUnicode=true&characterEncoding=utf-8
是使用utf8mb4所必需的。

它适用于我的应用程序。


2
投票

对于 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.

在此输入链接描述


1
投票

我在字符串中使用了 emoji,这是此错误的原因。

因此请确保您没有使用一些无法保存到数据库中的错误字符串。


0
投票

正如其他人所说,这是因为你试图将 4 个字节的数据保存到更少的空间中。

如果您在java中面临类似的问题并且没有灵活性更改数据库的字符集和整理编码,那么这个答案适合您。

您可以使用 Emoji Java 库来实现相同的目的。您可以在保存/更新到数据库之前转换为别名,并在保存/更新/从数据库加载后转换回 unicode。主要好处是即使在编码后文本也具有可读性,因为该库仅对表情符号而不是整个字符串进行别名。


0
投票

我更改了 MySQL 设置,但还是一样。最后,我在插入之前对字符串使用了 utf8_decode() 函数。


0
投票

批量插入特殊字符字段总是报错!

一行设置救了我的命。 🤣

batch insert error

with charset

© www.soinside.com 2019 - 2024. All rights reserved.