emoji 表情与MySQL编码问题

Emoji,这些能够表达情感的小卡通图像已经成为现代交流中不可或缺的一部分,以至于emoji这一单词已经在2015年被正式收入韦氏词典和牛津词典。说到emoji的诞生,这里还有一个很有趣的小故事:
1999年前后,日本一个名叫栗田穰崇的年轻人,和许多直男一样, 给女友发的短信经常会被误解。比如,“知道了”被解读成“生气了”、“不耐烦了”,随后引发冷战。 于是少年栗田想:“如果能在文字里插入一些表情符号来表达感情,大家应该会需要吧!”
原始的Emoji就这么诞生了
emoji 越来越流行,一个emoji 表情,有时胜过千言万语。尤其在移动端,很多用户喜欢把emoji 表情做为自己用户名称的一部分,例如微信中,就有很多朋友的用户名是这样的,如下:

这确实很好看,但这却给我们的应用程序带来了一定的问题。目前我们就碰到了一个因为用户名称中带有emoji 表情,导致数据无法存储的情况。
事情是这样的,我们的系统使用的数据库是MySQL,版本是5.5.31,最近我们发现我们的程序有不少报错,报错显示是有一些用户的数据无法保存,通过对报错日志分析,最终定位到是因为用户名中带有emoji 表情,导致数据存储失败。为什么会会数据会保存不了emoji表情呢?这里就牵涉到一个emoji的编码问题。

Emoji字符是Unicode字符集中一部分.
常见的Emoji表情符号在Unicode字符集中的范围和具体的字节映射关系, 可以在Emoji Unicode Tables中查看到.
有意思的是, 该表中还给出了同一个Emoji表情在不同系统或应用中的字体(是字体没错, Emoji的样式可通过字体文件改变)。

关于Emoji的最权威资料, 可以在Unicode? Emoji Charts上查阅到.
我们的MySQL是使用的utf8编码,但是因为UTF-8编码有可能是两个、三个、四个字节,其中Emoji表情是4个字节,而Mysql的utf8编码最多3个字节,所以导致了数据插不进去。所以为了让MySQL支持emoji表情的存储,必须要使用utf8mb4 编码。
utf8mb4作为utf8的super set,完全向下兼容,所以不用担心字符的兼容性问题。切换中需要顾虑的主要影响是mysql需要重新启动。

在升级前需要确定几件事情:
1、MySQL的版本。MySQL的版本必须为5.5.3以上的版本,如果不是需要先升级MySQL,因为之前的版本不支持utf8mb4
2、如果你用的是java服务器,升级或确保你的mysql connector版本高于5.1.13,否则仍然无法使用utf8mb4 。其它语言的暂不清楚。

mysql 修改的操作步骤需要修改以下几个地方:
1、修改mysql配置文件my.cnf
my.cnf一般在/etc/mysql/my.cnf位置。找到后请在以下三部分里添加如下内容:
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect=‘SET NAMES utf8mb4‘

2、修改database、table字符集。参考以下语句:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

3、重启mysql

4、检查字符集

character_set_system 的值是utf8没有关系,而且这个值不能改为utf8mb4,否则mysql 会启动不了。

好了,到此,数据就可以支持存储emoji 表情数据了。

总结:
1、由于目前移动互联网发展迅猛,并且emoji 越来越流行,所以为了避免在业务使用中升级MySQL字符集,最好是在部署MySQL的时候,就默认设置MySQL 支持 utf8mb4,因为utf8mb4是utf8的超集,是向下兼容,所以也不会影响utf8字符集的使用。
2、程序开发的时候,建库建表语句最好也指定库表的字符为 utf8mb4。
3、如果是已经在线的业务,而又不能重启MySQL的情况下,也可以通过应用层面转换emoji等特殊字符,以达到原数据兼容,在获取的时候,可以加一个标签注明,是否使用了emoji,这样取数据时,就再做转换就可。

时间: 2024-10-11 23:01:38

emoji 表情与MySQL编码问题的相关文章

让MySql支持Emoji表情(MySQL中4字节utf8字符保存方法)

手机端插入Emoji表情,保存到数据库时报错: Caused by: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x84' for column 'review' at row 1 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.jav

有关emoji表情以及utf-16编码

昨日IOS组的同事遇到一个棘手的问题:当输入框内含有emoji表情时,如何获取文本框内的字符数(一个emoji表情算一个字符). 先从我最近接触的JAVA说起,JAVA中,在使用String的length方法时,如果是普通的中英文字符,没有问题,但是如果该字符的Unicode编码大于0xFFFF,这个length方法就不能正确的获取字符数量了,事实上会把这样的特殊字符计算成2个字符.当然,JAVA已有现成的方法解决这个问题:codePointCount. 可惜的是,找了很久,在Objective

php解决微信开发中用户昵称中的特殊字符与emoji表情写入mysql错误的问题

解决办法:将3个字节的特殊字符与emoji表情替换掉即可. $nickname = preg_replace('/xE0[x80-x9F][x80-xBF]'.'|xED[xA0-xBF][x80-xBF]/S','?', $nickname ); $nickname = preg_replace('/\xEE[\x80-\xBF][\x80-\xBF]|\xEF[\x81-\x83][\x80-\xBF]/', '', $nickname);

django,mysql存储emoji表情,utf8mb4

今天在做后台的时候发现一个错误: Incorrect string value: '\\xF0\\x9F\\x90\\xA8' for column 'signature' at row 1 发现是参数里面是一个iOS的表情,也就是系统自带的emoji表情. 后台用的是django 1.6,数据库用的是Mysql 5.5.22,缓存用的是redis. 上网了解了一下emoji表情,原来一般的字符包括中文用utf8的话,mysql是用3个字节去存储的,而emoji表情要用4个字节的utf8,也就是

Mysql数据库存储emoji表情

emoji表情需要使用编码格式未utf8mb4,mysql数据库版本要5.5以上,我用的是5.6,因为只有5.5以上支持utf8mb4. 1.数据库编码设定为utf8mb4,如果建库时指定的是utf8,则需要执行语句:ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; 2.同时指定数据库配置参数中character_set_server改为utf8mb4 3.把对应的需要保存emoj

微信昵称包含emoji表情,保存异常

MySQL要存储emoji表情,由于emoji表情的unicode编码占用4个字节,而Mysql的utf8编码最多只能存储3个字节, 所以保存到数据库时会产生异常,一般两种解决方法, 方法一 修改数据库的字符集为utf8mb4,MySQL支持 emoji 表情的最低版本为5.5.3,否则不支持字符集utf8mb4. # 修改数据库: ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

【转】移动前端手机输入法自带emoji表情字符处理

http://blog.csdn.net/binjly/article/details/47321043 今天,测试给我提了一个BUG,说移动端输入emoji表情无法提交.很早以前就有思考过,手机输入法里自带的emoji表情,应该是某些特殊字符.既然是字符,那应该都能提交才对,可是为啥会被卡住呢?搜了一下,才发现,原来emoji用到的字符是4字节的utf-16(utf-16有2字节和4字节两种编码),而我们的数据库是采用的utf-8,并且最大只允许3字节的字符.这样冲突就产生了,表单因为这些em

移动前端手机输入法自带emoji表情字符处理

今天,测试给我提了一个BUG,说移动端输入emoji表情无法提交.很早以前就有思考过,手机输入法里自带的emoji表情,应该是某些特殊字符.既然是字符,那应该都能提交才对,可是为啥会被卡住呢?搜了一下,才发现,原来emoji用到的字符是4字节的utf-16(utf-16有2字节和4字节两种编码),而我们的数据库是采用的utf-8,并且最大只允许3字节的字符.这样冲突就产生了,表单因为这些emoji字符的存在无法提交. 找到原因之后,接下来就要考虑解决方案了.目前考虑到的两种方案,一是让后台处理,

用JS过滤Emoji表情的输入

本文为原创,转载请注明出处: cnzt       文章:cnzt-p http://www.cnblogs.com/zt-blog/p/6773854.html 在前端页面开发过程中,总会碰到不允许输入框输入emoji表情的需求,我的思路是通过编码用正则匹配表情,然后将其替换为空字符创.但是问题也是显而易见的,完整的编码集是什么呢?查阅了官方文档,发现上面并没有给出想要的答案.并且很多emoji表情除了主编码还有副编码(这是我给取的名字),举个例子: \uD83C\uDC00是一个表情,\uD