`

mysql/Java服务端对emoji的支持

阅读更多

引自:http://blog.csdn.net/junsure2012/article/details/42171035

前言:

 

最近开发的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字符集,多么痛的领悟!!

感谢这位仁兄的分享,顺利的帮助我解决了问题,但是我直接拿maven下载的驱动5.1.31还是不好用,后来修改成5.1.13后就没有问题了。

分享到:
评论

相关推荐

    mysql/Java服务端对emoji的支持与问题解决方法详解

    MySQL和Java服务端对emoji的支持并不是自然而然的,而是需要开发者采取一些特定措施来确保支持。 首先,了解emoji的编码方式是处理emoji字符的关键。在Unicode标准中,emoji表情是4个字节的字符,而传统的utf8编码...

    emoji-java-Java处理Emoji的类库

    此外,`emoji-java`还支持对单个Emoji的处理。`EmojiManager.getForAlias()`可以根据别名获取对应的Emoji,而`EmojiManager.getForUnicode()`则能根据Unicode码点找到对应的Emoji。这些功能使得开发者能够轻松地在...

    Java Emoji Converter表情转换工具

    3. **字符映射**:对于某些平台不支持的特定Emoji,Java Emoji Converter可能提供一种映射机制,将它们替换为可替代的符号或者图像。 4. **Unicode标准化**:对输入的文本进行Unicode Normalization,确保所有的...

    Mysql支持emoji 表情符号 升级编码为UTF8MB4

    在使用Mysql数据库时,如果需要支持emoji表情符号,需要对数据库的编码进行升级,以便正确地存储和显示emoji表情符号。下面是升级Mysql编码为UTF8MB4的步骤和注意事项: 为什么需要升级编码 在早期的Mysql版本中,...

    MySQL保存emoji表情

    在Java开发环境中,当数据库使用MySQL且编码设置为UTF-8时,尝试存储包含emoji表情的数据可能会遇到如下错误: ``` java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x93' for column '...

    mysql数据库支持emoji表情实例

    MySQL数据库在5.7.6版本之后开始正式支持Unicode 8.0,这其中包括了大量的emoji表情。这个实例展示了如何在MySQL...这个实例提供了从数据库设置到实际操作的完整流程,对于学习和实践MySQL对emoji的支持非常有帮助。

    JavaScript的Emoji转换库js-emoji.zip

    // https://github.com/github/gemoji/tree/master/images/emoji/unicode emoji.img_path = "http://my-cdn.com/images/emoji/"; // find out the auto-detected mode alert(emoji.replace_mode&#...

    emoji-java,Java缺少的emoji库:heart:.zip

    在Java编程环境中,由于语言本身对Unicode表情符号(emoji)的支持并不完善,开发者常常面临无法直接处理和显示emoji的困扰。"emoji-java"是一个专为Java设计的开源库,旨在填补这一空白,使得Java开发者也能方便地...

    java解析emoji表情存入oracle,并正常使用

    Oracle数据库系统在设计之初并未考虑对Unicode扩展区域的全面支持,因此默认情况下无法直接存储和检索emoji表情。Java作为一种广泛使用的编程语言,可以作为解决这一问题的桥梁。本文将深入探讨如何通过Java解析...

    表情包emoji-java-4.0.0.jar

    Java 内容输入表情存储jar 表情包emoji-java-4.0.0.jar。我的博客有关于的表情包工具类文章。可配套使用https://blog.csdn.net/haopingping_88/article/details/81740311

    java emoji处理工程例子

    5. **库的使用**:有许多开源库可以帮助Java开发者更方便地处理emoji,如`java-emoji`库,它提供了对emoji的解析和转换功能。 在这个工程例子中,可能包含了如何使用这些技巧和库来处理emoji的示例代码。通过分析...

    java处理emoji表情工具类

    java处理emoji表情工具类,可完美处理emoji表情。

    emoji-Java-4.0.0.jar

    在APP开发中,大多需要涉及表情符号丰富APP的亲和力,但是因为我们的数据库一般是utf8编码,是3个字节,而表情符号基本都是四个字节的unicode编码。emoji-Java解决数据库不能存储4字节表情符号的问题。

    Emoji表情的转码和解码

    本工具类包含了Emoji表情的转码和解码 包括了通过url获取文件大小的功能

    java web处理 emoji demo

    如果你需要将包含Emoji的数据存储到数据库,确保数据库和表的字符集设置为支持Unicode的,例如`utf8mb4`,这是MySQL中支持全Unicode字符(包括Emoji)的编码。同样,连接数据库时,也要指定合适的字符集。 3. **...

    emoji图片和编码表

    在iOS 4和5的时代,苹果开始广泛支持emoji,引入了自家的编码方案,以便在没有Unicode广泛支持的情况下在iPhone和iPad上显示这些表情符号。随着Unicode标准的普及,现代的iOS设备不再需要这些特定的编码方式,但了解...

    java-emoji

    java后台对emoji表情的处理,为了更便捷的存储数据库中,工具jar包

    Java emoji持久化mysql过程详解

    Java emoji持久化mysql过程详解 Java emoji持久化mysql过程详解是指在Java应用程序中如何将emoji表情持久化到mysql数据库的过程。由于mysql的utf-8字符集不能保存四字节的emoji表情符号,所以需要特殊处理。下面将...

    微信小程序添加emoji表情组件,雪碧图版本

    在微信小程序开发中,添加Emoji表情组件是一种常见的需求,特别是在社交类应用中,用户往往需要通过表情来丰富自己的表达。本文将详细介绍如何在微信小程序中实现一个基于雪碧图(Sprite Sheet)版本的Emoji表情组件...

Global site tag (gtag.js) - Google Analytics