`

java 微信昵称emoji表情保存失败 无法存入数据库(二)

阅读更多

参考链接:https://segmentfault.com/a/1190000000616820

mysql/Java服务端对emoji的支持

前言:

最近开发的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的配置:

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html
# *** DO NOT EDIT THIS FILE. It's a template which will be copied to the
# *** default location during install, and will be replaced if you
# *** upgrade to a newer version of MySQL.
[client]
default-character-set = utf8mb4


[mysql]
default-character-set = utf8mb4
character_set_connection = utf8mb4

[mysqld]
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
innodb_buffer_pool_size = 128M

# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
log_bin = MySql-bin

# These are commonly set, remove the # and set as required.
basedir = "D:/softApp/mysql"
datadir = "D:/softApp/mysqlData"
character-set-server = utf8mb4
character-set-client-handshake = FALSE
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'


port = 3306
server_id = MySql5.6



# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
join_buffer_size = 128M
sort_buffer_size = 2M
read_rnd_buffer_size = 2M

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

 

 

 

 

分享到:
评论

相关推荐

    java ipone 微信昵称emoji表情保存失败 问题解决

    当iPhone 5s用户尝试在昵称中使用emoji表情时,这些表情无法成功保存到MySQL数据库中,导致报出"java.sql.SQLException: Incorrect string value"的错误。这个问题的根本原因在于字符编码的不兼容性。 首先,我们...

    微信最新Emoji表情149个png打包.zip

    微信最新Emoji表情149个png打包.zip

    微信emoji表情包.rar

    这个"微信emoji表情包.rar"文件包含了微信平台上的109个官方表情,涵盖了日常聊天中的各种情绪和情境。 首先,我们来详细了解一下emoji的基本概念。Emoji起源于日本,最初是由手机运营商Docomo设计的一套图标,后来...

    最新微信111个官方默认emoji表情-更新于2020年5月18号

    原本想做个仿微信聊天室,需要微信的官方表情,但找了一天都没有找到满意的,所以自己截图再切图做了一个,打包就1个html和png文件夹,非常简洁;html文件打开就是示例效果,源码还包含了一个json数组,格式是:var ...

    简单调用:直接在网页上显示微信emoji表情的CSS

    在网页设计中,为了增强用户体验和情感表达,经常会使用各种表情图标,而微信emoji表情由于其丰富多样,深受用户喜爱。本教程将详细介绍如何通过简单的步骤,在网页上直接显示微信emoji表情,使得网页内容更加生动...

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

    本文将深入探讨如何通过Java解析emoji表情并将其安全地存入Oracle数据库,以及在移动端恢复显示这些表情。 首先,我们需要了解emoji表情的本质。它们属于Unicode字符集的一部分,特别是Unicode的补充区块,如...

    微信开发之emoji表情在网页上显示,很好用

    在微信开发过程中,有时我们需要在网页上展示用户发送的emoji表情,这为沟通增添了丰富的表现力。本教程将详细介绍如何在网页中正确显示这些表情,让用户体验更加生动有趣。 首先,我们要理解emoji表情的本质。它们...

    微信最新自带表情emoji.rar

    "微信最新自带表情emoji.rar"这个压缩包文件显然包含了微信的最新表情符号集,这些emoji是微信用户在聊天中表达情感、情绪和观点的重要工具。在进行通讯软件开发时,了解并熟悉这类表情系统的实现和应用对于提升用户...

    微信emoji表情图片包,包含一个文本对应表情的文件

    微信emoji表情图片包是一个用于开发和设计与表情相关的应用程序或功能的重要资源库。这个压缩包主要包含了一系列与微信平台兼容的emoji表情图像,这些图像通常用于增强用户在聊天、社交媒体和其他交互式应用中的表达...

    微信Emoji表情带文件名149个打包.zip

    微信Emoji表情是微信聊天中广泛使用的视觉符号,用于表达各种情绪和反应。这些表情不仅仅限于常见的笑脸、爱心和动物图像,还包括许多富有特色的图标,如庆祝、惊讶、沮丧等情感,以及各种情境下的特殊符号。这个...

    android 仿微信Emoji表情demo

    在Android开发中,实现类似微信的Emoji表情功能是一项常见的需求,尤其在聊天、评论等交互性强的应用场景。这个"android 仿微信Emoji表情demo"是一个示例项目,它旨在帮助开发者理解和实现这样的功能。下面我们将...

    微信emoji表情包*141.rar

    "微信emoji表情包*141.rar" 是一个包含141个不同表情的压缩文件,专为微信平台设计。这些表情涵盖了多种情感状态和情境,使用户能够更直观地表达自己的情绪,而不仅仅局限于文字描述。 1. 微信emoji的基本概念:...

    mysql保存微信昵称特殊字符的方法

    在MySQL中保存微信昵称,特别是包含特殊字符如表情符号(Emoji)的昵称时,可能会遇到插入数据时报错的问题。这是因为MySQL的默认UTF-8字符集(实际上是`utf8`,并非完全标准的UTF-8)仅支持最多3字节的字符,而一些...

    最全高清微信表情emoji

    最全的高清微信官方表情

    微信小程序Emoji表情源代码

    在微信小程序中使用Emoji表情,可以增强用户体验,使交互更加生动有趣。以下是对"微信小程序Emoji表情源代码"这个主题的详细说明: 1. **表情的表示方式**: 微信小程序中,Emoji表情通常有两种表示方式:Unicode...

    微信467特殊表情字符与对应的微信识别字符+111张微信emoji表情图

    本资源包包含了微信467个特殊的表情字符及其对应的微信识别字符,以及111张微信emoji表情图片,这对于我们深入理解和使用微信表情具有很大的帮助。 首先,我们要了解的是微信的表情系统。微信内置了一系列标准的...

    qq微信默认emoji表情图片打包附带对照表和js正则替换示例php代码

    QQ微信默认的emoji表情在社交应用中广泛使用,它们为用户提供了丰富的表达方式。这个压缩包包含QQ和微信两种平台的emoji表情图片,以及相关的对照表和编程示例,主要涉及的技术点有图像处理、字符编码和编程语言的...

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

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

    微信emoji表情转成图片资源包.zip

    微信emoji表情转成图片资源包.zip是一个包含微信表情符号的压缩文件,主要目的是为了方便用户在非微信环境中使用这些表情。微信是中国最流行的即时通讯应用之一,它提供了丰富的emoji表情来增强聊天体验。这个资源包...

    web 微信emoji显示

    在Web开发中,微信emoji显示是一项常见的需求,特别是在社交或者聊天功能的网页应用中。本文将详细介绍如何在Web端实现微信emoji表情的显示,并结合给定的文件资源——`emoji.css`、`table.htm`、`emoji.js`和`emoji...

Global site tag (gtag.js) - Google Analytics