Java开发中 MySQL存储emoji表情报错的处理方法 MySQL中utf8mb4编码使用

哈根达斯
2021-07-18 / 0 评论 / 260 阅读 / 正在检测是否收录...

在平时的网络平台应用开发中,需要需微信公众号的平台进行对接,在使用mysql存储微信昵称时常用用户使用emoji表情,常见的处理方式有如下:

  1. mysql使用utf8mb4编码
  2. 程序中替换emoji为其它字符串

今天我们主要来介绍mysql使用utf8mb4编码方法解决问题

文章目录索引

utf-8编码可能2个字节、3个字节、4个字节的字符,但是MySQL的utf8编码只支持3字节的数据,而emoji表情数据是4个字节的字符。如果直接往采用utf-8编码的数据库中插入表情数据,Java程序中将报SQL异常:

ava.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for column 'nickname' 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)

utf8mb4编码是utf8编码的超集,兼容utf8,并且能存储4字节的表情字符。
采用utf8mb4编码的好处是:存储与获取数据的时候,不用再考虑表情字符的编码与解码问题。

一、要求

1. MySQL的版本
utf8mb4的最低mysql版本支持版本为5.5.3+,若不是,请升级到较新版本。
2. MySQL驱动
5.1.34可用,最低不能低于5.1.13

一、配置修改

1 .修改MySQL配置文件

修改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'

修改完成后重启mysql服务,并检查编码结果

SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';

显示如下:

Variable_nameValue
character_set_clientutf8mb4
character_set_connectionutf8mb4
character_set_databaseutf8mb4
character_set_filesystembinary
character_set_resultsutf8mb4
character_set_serverutf8mb4
character_set_systemutf8
character_sets_dirC:data
collation_connectionutf8mb4_general_ci
collation_databaseutf8mb4_unicode_ci
collation_serverutf8mb4_unicode_ci

其中参数变量 collation_connection 、collation_database 、collation_server是什么没关系,但必须保证以下参数变量必须是utf8mb4

character_set_client:客户端来源数据使用的字符集
character_set_connection:连接层字符集
character_set_database:当前选中数据库的默认字符集
character_set_results:查询结果字符集
character_set_server:默认的内部操作字符集

1 .数据库连接的配置
数据库连接参数中:characterEncoding=utf8会被自动识别为utf8mb4,也可以不加这个参数,会自动检测。
autoReconnect=true是必须加上的。

jdbc:mysql://127.0.0.1:3306/dbname?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false&serverTimeZone=GMT+8

2 .修改字段名字符集
修改nickname字符集编码为utf8mb4_unicode_ci

ALTER TABLE `tb_user` 
MODIFY COLUMN `nickname` char(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL;

然后就可以保存emoji到数据库中,如下图可以在Navicat Premium中查看已保存的emoji表情

kr9bisdp.png

0

评论 (0)

取消