MySQL保存emoji表情之Linux设置数据库编码为utf8mb4

mybatis 同时被 2 个专栏收录
2 篇文章 0 订阅
7 篇文章 0 订阅

一、问题背景:

MySQL数据库编码为utf8时,保存emoji表情失败,异常信息:

java.sql.SQLException: Incorrect string value: ‘\xF0\x9F\x92\x94’ for column ‘content’ at row 1

查看数据库字符集信息,如下

mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character%' OR Variable_name LIKE 'collation%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /opt/mysql/share/charsets/ |
| collation_connection     | utf8_general_ci            |
| collation_database       | utf8mb4_unicode_ci         |
| collation_server         | utf8_general_ci            |
+--------------------------+----------------------------+
11 rows in set

查找资料,了解到collation_connection 、collation_database 、collation_server是什么没关系。

但必须保证

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

这几个变量必须是utf8mb4

二、解决问题步骤:

1、Linux环境, 通过编辑my.cnf文件,设置MySQL数据库字符集,centos6.5 安装MySQL 5.7.21 ,没有找到my.cnf文件。

关于,MySQL读取配置参数顺序,如下描述:

On Unix, Linux and Mac OS X, MySQL programs read startup options from the following files, in the specified order (top items are used first).

File NamePurpose
/etc/my.cnfGlobal options
/etc/mysql/my.cnfGlobal options
SYSCONFDIR/my.cnfGlobal options
$MYSQL_HOME/my.cnfServer-specific options
defaults-extra-fileThe file specified with --defaults-extra-file=path, if any
~/.my.cnfUser-specific options

即/etc/my.cnf  ——> /etc/mysql/my.cnf——>/usr/local/mysql/etc/my.cnf

2、将Windows环境安装的MySQL配置文件my-default.ini,copy至Linux服务器/usr/local/mysql/etc/目录下,重命名为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'

完整文件如下:文件下载地址

3、重启MySQL数据库

输入以下命名重启MySQL数据库,

service mysqld restart

Linux进入MySQL命令行模式:

mysql -uroot -p

查看修改后结果:

mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character%' 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                             |
| character_sets_dir       | /usr/local/mysql/share/charsets/ |
| collation_connection     | utf8mb4_unicode_ci               |
| collation_database       | utf8mb4_unicode_ci               |
| collation_server         | utf8mb4_unicode_ci               |
+--------------------------+----------------------------------+
11 rows in set (0.31 sec)

至此,数据库字符集修改成功。

三、后记:

如果是Windows下通过Navicat连接MySQL,会发现修改重启数据库后,查询结果如下:

一直怀疑数据库字符编码,修改失败,想想可能和连接的客户端有关,将Navicat的数据库连接属性,编码选项修改为utf-8

查询结果与Linux MySQL命令行查询结果一致。最后上传一张,项目效果图

参考资料:

http://blog.51cto.com/suifu/1853864

https://www.cnblogs.com/shihaiming/p/5855616.html

  • 0
    点赞
  • 0
    评论
  • 3
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值