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

问题描述:

对于IOS开发来说,iOS项目因为需要用户文本的存储,自然就遇到了emoji等表情符号如何被mysql DB支持的问题

如果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/GBK等传统字符集升级到utf8mb4将是势在必行。你可以通过应用层面转换emoji等特殊字符,以达到原DB的兼容,我认为可行,但是你可能走了弯路。

utf8mb4作为utf8的super set,完全向下兼容,所以不用担心字符的兼容性问题。切换中需要顾虑的主要影响是mysql需要重新启动(虽然mysql官方文档说可以动态修改配置,但是经过数次测试,还是需要重启才可生效),对于业务可用率的影响是需要考虑的大问题,这里就暂时不展开讨论了。

升级步骤:

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

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)

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)

特别说明下:collation_connection/collation_database/collation_server如果是utf8mb4_general_ci,没有关系。但必须保证character_set_client/character_set_connection/character_set_database/character_set_results/character_set_server为utf8mb4。关于这些字符集配置是干什么用的,有什么区别,请参考:深入Mysql字符集设置

5.如果你用的是java服务器,升级或确保你的mysql connector版本高于5.1.13,否则仍然无法使用utf8mb4
这是mysql官方release note,大家可以查看说明,并下载最新的mysql connector for java的jar包。
这里为大家提供一个:mysql-connector-java-5.1.31-bin.jar
同时记得修改pom配置哦~

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字符集。

更多如下

MySQL乱码问题以及utf8mb4字符集
Emoji表情符号兼容方案

时间: 2024-10-28 12:41:53

IOS mysql/Java服务端对emoji表情的支持的相关文章

mysql/Java服务端对emoji的支持 专题

关于utf8不支持emoji是因为emoji是用4个字节存储的字符,而mysql的utf8只能存储1-3个字节的字符.那就存不了呗 需要更改的地方:(1)Mysql服务器client,mysql,mysqld中需要显式指定字符集为utf8mb4(2)在(1)的服务器上创建的db,需要为utf8mb4字符集,COLLATE为utf8mb4_unicode_ci 或 utf8mb4_general_ci(3) 在(2)的db中创建table和存放emoji字段的字符集为utf8mb4,collate

Java服务端压缩GZIP IOS解压问题

问题描述 Java服务端压缩GZIP IOS解压问题 在Java端用什么方法加压GZIP 在IOS端能解压出来 IOS用libz库方式解压的 求大神解答..找了很多种压缩方式都不行 IOS一直解压不出来 解决方案 iOS与Java服务器GZip压缩问题iOS与Java服务器GZip压缩问题iOS与Java服务器GZip压缩问题 解决方案二: 一般都是用标准的gzip压缩格式 各种平台都是一样的 你要看看java是否压缩正确了 用其它工具能否解压成功

java服务端如何实现对安卓和苹果客户端发来的不同数据格式进行处理和判断?

问题描述 java服务端如何实现对安卓和苹果客户端发来的不同数据格式进行处理和判断? 服务端是java写的,安卓客户端与服务端通信是用java的对象流,直接传对象进行socket通信,但是苹果的客户端不能采用这种方式,现苹果客户端打算用json 格式的字符串与服务端进行socket通信,请问大神们,我该如何对客户端传来的socket流进行判断,到底是安卓发来的还是苹果发来的呢?谢谢! 解决方案 都使用json,不同的客户端用一个字段表示,服务器判断下 解决方案二: 加上信息头,里面包括设备类型,

ios-开发iOS App,服务端采用哪些语言和架构比较好?

问题描述 开发iOS App,服务端采用哪些语言和架构比较好? 开发iOS App,服务端采用哪些语言和架构比较好?对这个接触的比较少,希望大家能够指点指点 解决方案 除非在服务器端有大量的运算,否则什么语言都不要用,用Parse http://www.parse.com.简单的说Parse是专门面向移动应用的云计算解决方案.它使用no-schemajason格式数据库,并以restful的service形式暴露给第三方应用.官方提供了iOS Android javascript的SDK 也有非

RDS for MySQL 使用 utf8mb4 字符集存储 emoji 表情

RDS for MySQL 使用 utf8mb4 字符集存储 emoji 表情 1. 基本原则 2. 三个条件的说明 2.1 应用客户端 2.2 应用到 RDS MySQL 实例的连接 2.3 RDS 实例配置 3. 通过 set names 命令设置会话字符集 1. 基本原则 如果要实现存储 emoji 表情到 RDS for MySQL 实例,需要应用客户端.到 RDS for MySQL 实例的连接.RDS 实例内部 3 个方面统一使用或者支持 utf8mb4 字符集. 注:关于 utf8

关于java服务端新用户注册问题

问题描述 关于java服务端新用户注册问题 怎么在java服务端判断新注册用户账号是否可用!求代码,本人刚入行 是菜鸟啊 这个方法里面改怎么写啊, @Override public boolean IsExistAccount(String username, short accountType) throws TException { // TODO Auto-generated method stub return false; } 解决方案 首先要判断username是否符合你的规定,有没

java-一个简单的Java服务端,客户端的demo中的问题。

问题描述 一个简单的Java服务端,客户端的demo中的问题. 首先说我的问题:我需要用java做一个服务器端,当客户端发过一条请求来以后,服务器端开始每隔1s对客户端发送一个字符串. 然后说我的思路: 这是服务端. public static void main(String[] args) { String temp; try { while (true) { ServerSocket ss = new ServerSocket(30000); // 每当接受到客户端socket的请求,服务

数据-app和java服务端交互方式选择

问题描述 app和java服务端交互方式选择 后端存在多个API服务(A,B,C),方式1:app端分别调用ABC三个服务, 方式2:app调用一个D服务,D服务来调用ABC服务:方式1的好处防止服务集中化, 方式2的好处统一app的安全验证,和app数据格式统一等. 个人偏向方式2,求建议. 解决方案 方式2如果接入量小可以,接入量大容易形成性能瓶颈. 方式1,加个登录session可以解决身份验证问题. 解决方案二: 这两种情况都有可能,具体看你们现有的结构,比如有多个后台项目部署,那么某个

Java服务端业务要跑较长时间,如何把运行过程中console的stdout实时反馈给前端?

问题描述 服务端要传文件,跑脚本,console打印的大量后台日志信息如何实时反馈给前端,让前端实现实时日志更新的效果? 解决方案 本帖最后由 pcs007 于 2014-08-18 21:07:14 编辑解决方案二:控制台的信息是你决定的,你可以把同样的信息实时交互给前端,后者更新解决方案三:这的就前端判断更新然后去拿信息啊解决方案四:在linux服务器上面,前端日志打印到file.log使用命令tail-ffile.log时时监控日志变化windows服务器的话,没有太关注解决方案五:你的前