mysql/Java服务端对emoji的支持

原创 2015年07月06日 17:25:51

最近在微信公众平台开发的过程中,同步微信粉丝数据的时候,当粉丝的昵称中有表情符号的时候,发生异常。 

具体描述:

如果UTF8字符集且是Java服务器的话,当存储含有emoji表情时,会抛出类似如下异常:

java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for column 'name' at row 1  
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)  
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3593)  
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3525)  
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1986)  
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2140)  
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2620)  
    at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1662)  
    at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1581)

这就是字符集不支持的异常。因为UTF-8编码有可能是两个、三个、四个字节,其中Emoji表情是4个字节,而Mysql的utf8编码最多3个字节,所以导致了数据插不进去。

升级前需要考虑的问题:

如果你的项目要进行移动产品的用户文本的存储,将你的DB字符集从UTF8字符集升级到utf8mb4将是势在必行。

utf8mb4作为utf8的super set,完全向下兼容,所以不用担心字符的兼容性问题。

升级步骤:

1.utf8mb4的最低mysql版本支持版本为5.5.+,若不是,请升级到较新版本。

mysql版本查看命令请看:查看mysql版本的四种方法;mysql安装步骤请看:Linux中升级Mysql到Mysql最新版本的方法
2.修改database、table和column字符集。参考以下语句:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE table_name CHANGE column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
3.修改mysql配置文件my.cnf(windows为my.ini)

如果是window环境的话,mysql5.6配置文件的位置在C:\ProgramData\MySQL\MySQL Server 5.6

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'

4.重启 MySQL Server、检查字符集

1.)重启命令参考:/etc/init.d/mysql restart

2.)输入命令:mysql,进入mysql命令行(如果提示没权限,可以尝试输入mysql -uroot -p你的密码)

3.)在mysql命令行中输入:SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';

检查是否如下:

+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+--------------------+
| character_set_client    | utf8mb4            |
| character_set_connection | utf8mb4            |
| character_set_database  | utf8mb4            |
| character_set_filesystem | binary            |
| character_set_results    | utf8mb4            |
| character_set_server    | utf8mb4            |
| character_set_system    | utf8              |
| collation_connection    | utf8mb4_unicode_ci |
| collation_database      | utf8mb4_unicode_ci |
| collation_server        | utf8mb4_unicode_ci |
+--------------------------+--------------------+
rows in set (0.00 sec)


5.如果你用的是java服务器,升级或确保你的mysql connector版本高于5.1.13,否则仍然无法使用utf8mb4

6.检查你服务端的db配置文件:

 

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=TRUE
jdbc.username=root
jdbc.password=password

 

特别说明其中的jdbc.url配置:如果你已经升级好了mysql-connector,其中的characterEncoding=utf8可以被自动被识别为utf8mb4(当然也兼容原来的utf8),autoReconnect配置我强烈建议配上,我之前就是忽略了这个属性,导致因为缓存缘故,没有读取到DB最新配置,导致一直无法使用utf8mb4字符集!!

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Java Mysql Emoji 配置

关键:把 Mysql 的字符集从 utf8 改为 utf8mb4...

mysql/Java服务端对emoji的支持

前言: 最近开发的iOS项目因为需要用户文本的存储,自然就遇到了emoji等表情符号如何被mysql DB支持的问题。困扰了数日,在就要绝望放弃的边缘,终于完成了转换和迁移。在此特别分析和整...

【OA】——用Struts2拦截器实现对每一个请求的权限判断

需求:      我们在做系统的时候,使用系统的用户经常会分为很多种角色。比如什么都可以访问的admin,只能管理论坛的管理员。等等。我们系统中就遇到了权限分配的问题,那什么是权限,权限就是对系统...

struts2的工作流程(简单)

首先我们先来看一下struts2的框架结构图 图 1 struts2体系的结构图 从图1我们不难看出struts2的工作流程大致分为一下几部分1、客户端请求一个Http...

IOS mysql/Java服务端对emoji表情的支持

问题描述: 对于IOS开发来说,iOS项目因为需要用户文本的存储,自然就遇到了emoji等表情符号如何被mysql DB支持的问题 如果UTF8字符集且是Java服务器的话,当存储含有emoj...

mysql/Java服务端对emoji的支持

前言: 最近开发的iOS项目因为需要用户文本的存储,自然就遇到了emoji等表情符号如何被mysql DB支持的问题。困扰了数日,在就要绝望放弃的边缘,终于完成了转换和迁移。在此特别分析和整理,方便...

客户端提交emoji到服务端,服务端出错的处理方式[转]

emoji资料 今天研究了emoji,挺有意思,资料挺多,摘要一些信息给大家分享,也算是自己记录学习。 emoji介绍 Emoji (絵文字,词义来自日语えもじ,e-moji,moji在日语中的...

GPRS_DTU_GPS_mysql服务端1

  • 2014年01月19日 14:28
  • 3.9MB
  • 下载

mysql免安装服务端

  • 2016年11月24日 15:41
  • 4.28MB
  • 下载

在使用xutils时post请求传递中文到服务端Mysql数据库出现中文乱码。

在使用xutils时post请求传递中文到服务端Mysql数据库出现中文乱码。 这个问题困惑了我很久,也走了很多弯路。经过不断的探究终于找到了问题的解决方案。 第一:查看自己的mysql的编码...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:mysql/Java服务端对emoji的支持
举报原因:
原因补充:

(最多只允许输入30个字)