表情符号未正确存储在 MySQL 5.6 中,排序规则为 utf8mb4
Posted
技术标签:
【中文标题】表情符号未正确存储在 MySQL 5.6 中,排序规则为 utf8mb4【英文标题】:Emoji is not stored properly in MySQL 5.6 with collation utf8mb4 【发布时间】:2015-07-29 10:39:28 【问题描述】:我正在尝试将表情符号存储到我服务器中的数据库中。我使用 AWS EC2 实例作为服务器,我的服务器详情如下:
操作系统:ubuntu0.14.04.1
mysql 版本:5.6.19-0ubuntu0.14.04.1 - (Ubuntu)
数据库客户端版本:libmysql - mysqlnd 5.0.11-dev - 20120503
我使用以下 SQL 在服务器中创建了一个数据库测试和表表情符号:
CREATE DATABASE IF NOT EXISTS `test` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
USE `test`;
CREATE TABLE IF NOT EXISTS `emoji` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`text` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=1;
当我尝试执行以下插入时,出现警告并且数据未正确存储:
INSERT INTO `test`.`emoji` (`id` , `text`) VALUES (NULL , '???? ???? ???? ????');
插入的行 ID:3
警告:#1366 不正确的字符串值:'\xF0\x9F\x91\x86 \xF0...' for column 'text' at row 1
文本列中存储的值为:???? ??? ??? ????
相同的场景适用于我的本地数据库,并且值已正确存储。除了操作系统(Windows)之外,我本地的几乎所有配置都相似。
【问题讨论】:
请SHOW CREATE TABLE test.emoji\G
-- 我想看看你创建它后它是否被破坏了。
Wat 提示您运行失败的INSERT
是什么提示? (F09F9186 看起来是正确的。)
CREATE TABLE emoji
(id
int(10) unsigned NOT NULL AUTO_INCREMENT, text
varchar(255) NOT NULL, PRIMARY KEY (id
)) ENGINE=InnoDB AUTO_INCREMENT=4默认字符集=utf8mb4
请提供SELECT text, HEX(text) FROM emoji
(针对有问题的行)。发生了一些奇怪的事情。
1 warning
-- 再次运行查询,然后及时执行SHOW WARNINGS;
【参考方案1】:
我能够使用 SqlWorkbench 重新创建您的问题。
您的客户端很可能已经建立了与字符集与表的字符集不匹配的数据库的连接:
在运行插入语句之前运行此语句以对齐字符集和连接的排序规则:
SET NAMES utf8mb4 COLLATE utf8mb4_general_ci
希望这会有所帮助,字符集可能很棘手。
【讨论】:
【参考方案2】:尝试使用以下堆栈 Node-Js 12.13.x、Mysql 5.6 将表情符号保存在我现有的数据库表中。
周围:
-
要么关注这个solution
或者将列数据类型改为BLOB即
ALTER TABLE table_name CHANGE column column BLOB NULL
希望这个技巧对你有用!
【讨论】:
【参考方案3】:使用工作台从 MSSQL 迁移到 MySQL 总是遇到问题。
Workbench 已经设置了 utf8mb4,还是报错。
然后我遵循@Haisum Usman 的建议:
-
在生成的迁移 sql 中将列设置为 Blob。
迁移数据
将列更改为 LONGTEXT!
投入大量时间来完成这项工作。
【讨论】:
以上是关于表情符号未正确存储在 MySQL 5.6 中,排序规则为 utf8mb4的主要内容,如果未能解决你的问题,请参考以下文章