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

Posted

技术标签:

【中文标题】不正确的字符串值:\'\\xF0\\x9F\\x8E\\xB6\\xF0\\x9F...\' MySQL【英文标题】:Incorrect string value: '\xF0\x9F\x8E\xB6\xF0\x9F...' MySQL不正确的字符串值:'\xF0\x9F\x8E\xB6\xF0\x9F...' MySQL 【发布时间】:2013-12-23 01:39:12 【问题描述】:

我正在尝试在我的 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 对不起,数据库连接的字符集是什么意思?数据库的字符集是utf8mb4,排序规则是utf8mb4_general_ci 我也收到了一条与这条推文类似的错误消息twitter.com/OfficialMansi/status/406007380241969152 这条推文的末尾有一个笑脸。错误消息是 Incorrect string value: '\xF3\xBE\x8D\x83 h...' for column 'tweet_text' at row 1 如果没有其他方法,您介意只为该表发布“创建表”语句吗? 不是列的字符集,连接字符集!当你连接到数据库时,有一个连接字符集 它告诉数据库您将发送数据的编码以及您期望返回的编码。您是如何准确连接到数据库的? 【参考方案1】:

根据create table语句,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 来处理字符集)。 这对我也有用。在服务器中设置正确的字符集是不够的。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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】:

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

【讨论】:

【参考方案5】:

SET NAMES utf8utf8mb4 编码不兼容,这可能很明显,但我仍然感到惊讶。所以对于某些应用程序来说,改变表/列编码是不够的。我不得不更改应用配置中的编码。

红宝石(红宝石,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 用作列/表编码并且仍然出现此类错误,请确保您已为应用程序中的数据库连接配置正确的字符集。

【讨论】:

Redmine - 当配置应用于已经存在的数据库时无法正常工作,所以这里是修复它的迁移代码redmine.org/issues/21398 感谢发布 Yii 解决方案,它成功了。【参考方案6】:

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

即使数据库有一个默认的 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;

【讨论】:

【参考方案7】:

我终于能够找出问题所在。 我不得不更改 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%';

【讨论】:

旁注:如果您使用 node npm sequelize + MySQL,您需要以一种特殊的方式设置字符集,至少对我来说这似乎很古怪。 github.com/sequelize/sequelize/issues/395 天哪,:) 非常感谢 db1。大约 12 小时后完成您的建议。我刚刚在代码中的连接创建时刻执行了“set names utf8mb4”,然后所有事情都正常进行了。 我执行了 SET NAMES utf8mb4;在我的插入之前查询,但现在我无法从准备好的语句中获取新的插入 ID。请建议我解决这个问题 我编写了一个脚本,它将自动转换数据库中的所有表gist.github.com/pobegov/f8b293fb6eb658a13feb1c318e6c07ed 只是添加推理-在 MySQL 中,UTF-8 每个字符只能容纳 3 个字节。 MySQL编码utf8mb4其实是真正的4字节utf8编码。

以上是关于不正确的字符串值:'\xF0\x9F\x8E\xB6\xF0\x9F...' MySQL的主要内容,如果未能解决你的问题,请参考以下文章

C#,输入字符串的格式不正确,十进制值

日期时间格式无效:1366 字符串值不正确

如何修复“不正确的字符串值”错误?

如何修复“不正确的字符串值”错误?

MySQL抛出不正确的字符串值错误

字符串值不正确:' xAE'