欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

mysql存储emoji表情报错的处理方法【更改编码为utf8mb4】

程序员文章站 2022-03-29 18:51:25
本文实例分析了mysql存储emoji表情报错的处理方法。分享给大家供大家参考,具体如下: utf-8编码可能2个字节、3个字节、4个字节的字符,但是mysql的utf8...

本文实例分析了mysql存储emoji表情报错的处理方法。分享给大家供大家参考,具体如下:

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

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)

可以对4字节的字符进行编码存储,然后取出来的时候,再进行解码。但是这样做会使得任何使用该字符的地方都要进行编码与解码。

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

更改数据库的编码为utf8mb4:

1. mysql的版本

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

2. mysql驱动

5.1.34可用,最低不能低于5.1.13

3.修改mysql配置文件

修改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. 重启数据库,检查变量

复制代码 代码如下:
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

collation_connection 、collation_database 、collation_server是什么没关系。

但必须保证

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

这几个变量必须是utf8mb4。

5. 数据库连接的配置

数据库连接参数中:

characterencoding=utf8会被自动识别为utf8mb4,也可以不加这个参数,会自动检测。

autoreconnect=true是必须加上的。

6. 将数据库和已经建好的表也转换成utf8mb4

更改数据库编码:

复制代码 代码如下:
alter database caitu99 character set utf8mb4 collate utf8mb4_general_ci;

更改表编码:

复制代码 代码如下:
alter table table_name convert to character set utf8mb4 collateutf8mb4_general_ci;

如有必要,还可以更改列的编码

7、在第3步设置character_set_database,character_set_server不成功的可以试下直接在mysql.exe下

set @@character_set_server='utf8mb4';
set @@character_set_database='utf8mb4';

这下数据库就可以存下emoji表情的编码了。

附上我的my.ini

# 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
[mysqld]
character-set-client-handshake = false
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='set names utf8mb4'
# 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
# these are commonly set, remove the # and set as required.
# basedir = .....
# datadir = .....
# port = .....
# server_id = .....
# 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

更多关于mysql相关内容感兴趣的读者可查看本站专题:《mysql存储过程技巧大全》、《mysql常用函数大汇总》、《mysql日志操作技巧大全》、《mysql事务操作技巧汇总》及《mysql数据库锁相关技巧汇总

希望本文所述对大家mysql数据库计有所帮助。