关于用 MySQL 存储 Emoji

2014-10-09 02:38:07 +08:00
 Livid

如果你希望让你的网站或者 App 支持 Emoji,那么在初次设置 MySQL 时,有一些细节你需要知道。

Emoji

Emoji 字符的特殊之处是,在存储时,需要用到 4 个字节。而 MySQL 中常见的 utf8 字符集的 utf8_general_ci 这个 collate 最大只支持 3 个字节。所以为了能够存储 Emoji,你需要改用 utf8mb4 字符集。

在创建表时,用类似这样的语句:

CREATE TABLE `tbl` (...) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci;

MySQL 版本

utf8mb4 字符集的支持是 MySQL 5.5 的新功能,所以你需要确保你使用的 MySQL 版本至少是 5.5。基本上,2014 年以后的新项目都应该直接上 5.6 了。

MySQL 备份和导入

在启用了 utf8mb4 字符集之后,备份和导入时就不能再用默认参数了。

用 mysqldump 备份时,需要加入:

mysqldump --default-character-set=utf8mb4

而在恢复备份或通过程序连接时,需要在每次连接打开之后发送下面这条 SQL 指令:

SET CHARSET utf8mb4
32512 次点击
所在节点    MySQL
41 条回复
LINAICAI
2014-10-09 14:41:54 +08:00
顶,以后用到
Emory_M
2014-10-09 15:59:07 +08:00
Emoji字符在node.js截取会出现问题,产生unicode乱码,使输出JSON无法通过iOS原生的JSON解析器~
Keinez
2014-10-10 03:11:34 +08:00
Emoji字符集的BUG我们上个月就遇到了……
pubby
2014-10-14 20:18:42 +08:00
我说怎么没碰到这个问题,原来我存的时候就是评论和一堆东西 json_encode()后存的,取出来 json_decode() 后展示的
imlewc
2015-01-30 12:29:11 +08:00
mysql 5.5.3最低版本 纠结了好久 原来我的5.5.2.。。。
mingyun
2015-05-24 13:47:02 +08:00
@pubby json_encode后decode能正常显示吗
pubby
2015-05-24 15:58:50 +08:00
@mingyun php中json_encode后会变成\uXXXX 因此没有问题
lzvezr
2018-12-08 16:45:15 +08:00
@Emory_M 应该是 js 的问题,带有 emoji 的字符串 emoji 会被拆分成两个字符,影响到长度,排序,码点转换,正则等方面,在 es6 里有解决方案
liuyanjun0826
2018-12-08 16:49:16 +08:00
我们公司没有应用最新版本的软件,因为没有钱采购最新版本的硬件
greatx
2018-12-08 16:55:42 +08:00
2014 年的帖子
xbigfat
2018-12-08 17:00:24 +08:00
刚做好 mysql 的消息存储,看到帖子,试着发了一个 emoji 果然直接挂了。。。😂(试一下 v2 )
(图片)[https://imgchr.com/i/F3OhE4]
Sylv
2018-12-08 17:06:36 +08:00
@Livid
奇怪,2014 年的帖子为什么突然跑到首页了?
Linxing
2018-12-08 17:08:38 +08:00
我们都是前端转码存
leoleoasd
2018-12-08 17:08:42 +08:00
@Sylv #32 有人回复了一下..
Sylv
2018-12-08 17:11:25 +08:00
@leoleoasd 一般老帖即使有新回复也不会被顶到首页,首页只有近一两天的帖子。
tomoya92
2018-12-08 17:15:03 +08:00
@Sylv 看看帖子作者是谁🙈
lzvezr
2018-12-08 17:18:19 +08:00
咦,原来是 14 年的吗?完全没注意到
xiangyuecn
2018-12-08 18:23:15 +08:00
也许人家起初压根就只想支持 0x00-0xff,吧,现在还不默认支持一下 0x00-0xff ff ff ff,每次上一次痛一次,多写代码味道很不错。底层直接把支持 3 字节改到支持 4 字节,目测对 98%的吃瓜开发者是透明而且是无痛的

顺势强推篇 emoji 字节码的文章 cnblogs .com /xiangyuecn/p/8598605.html
cyspy
2018-12-09 09:40:22 +08:00
@andybest emoji 并不是图片
c4f36e5766583218
2019-02-22 18:26:55 +08:00
我使用过程中并没有调整 mysqldump,我的如下:
1. 服务端配置调整
[mysqld]
character_set_server=utf8mb4
2. 客户端
jdbc.url=jdbc:mysql://x.x.x.x:x/x?useSSL=false&createDatabaseIfNotExist=true
不要带上编码的那个参数
3. 建表(/字段 /库) 添加 CHARSET=utf8mb4

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/137724

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX