关于用 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
32487 次点击
所在节点    MySQL
41 条回复
cevincheung
2014-10-09 03:49:39 +08:00
通过在移动设备上测试http post到服务器后直接入库,然后http get json response得到的还是问号。
andybest
2014-10-09 05:37:55 +08:00
不太明白,Emoji 字符 是什么?是指将 Emoji 表情图片以二进制整个存入数据库?
还是指一个 utf8_general_ci 字符集不包含的字符范围内的某部分字?
0bit
2014-10-09 06:58:16 +08:00
这个经验真的很好,尤其是备份恢复那个,没有注意设置编码,所以都变成了问号。
that
2014-10-09 08:16:58 +08:00
受用,已收藏
NemoAlex
2014-10-09 08:19:53 +08:00
@andybest 后者
est
2014-10-09 09:16:31 +08:00
其实个人觉得不用整个库都用utf8mb4,响应varchar或者text字段指定用 utf8mb4 即可。(不知道可不可以这样)
mengzhuo
2014-10-09 09:18:10 +08:00
@andybest 比如这些字符 🐶
GitFree
2014-10-09 09:28:57 +08:00
没必要为了几个字段把全表都搞成utf8mb4吧?建议有表情的字段还用varchar,存之前pickle.dumps一下,用之前pickle.loads一下
ipconfiger
2014-10-09 09:37:40 +08:00
@est 阿里云上的RDS之前没升级到5.5,又要支持emoji,结果只好把字符串base64一下存,取出来的时候再base64一次,蛋痛死了
RainFlying
2014-10-09 09:57:47 +08:00
我厂很久之前就很蛋疼地把 Emoj 存进去了。。
juicy
2014-10-09 10:15:26 +08:00
那么就是说数据库会把四个字节的emoji字符截取三个字节来存储么?
qdvictory
2014-10-09 10:25:31 +08:00
如果是5.5以下版本,可以将相关字段转为二进制存储。
Esay
2014-10-09 10:47:22 +08:00
可以贴代码了?
felinx
2014-10-09 10:47:38 +08:00
@ipconfiger 蛋还在不在?
too
2014-10-09 10:51:00 +08:00
遇到过这个问题。似乎用低版本的客户端连接还不行呢,对于中央数据库这种,其他客户端连上来的版本都得升级...
neekey
2014-10-09 10:53:54 +08:00
fly2never
2014-10-09 11:04:27 +08:00
我们是数据库编码全换,几年前的事情了
Livid
2014-10-09 11:31:47 +08:00
@Esay 是的,V2EX 会在 10 月公布新的 Markdown 发帖接口,带有 GitHub Flavored Markdown 的语法高亮功能。
Esay
2014-10-09 11:34:51 +08:00
@Livid 赞,但是估计对第三方应用开发的同学是个挑战
6711411
2014-10-09 12:46:51 +08:00
改为 utf8mb4 之后索引的名字的长度也是个问题.

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

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

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

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

© 2021 V2EX