问题描述:
当存储含有emoji表情时,会抛出类似如下异常:
java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for column 'name' at row 1
这就是字符集不支持的异常。因为UTF-8编码有可能是两个、三个、四个字节,其中Emoji表情是4个字节,而Mysql的utf8编码最多3个字节,所以导致了数据插不进去
问题处理:
第一步,修改MySQL数据库编码集为utf8mb4;
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'
修改完数据库的编码设置需要对数据库进行重启一下
/etc/init.d/mysql restart
输入命令,进入mysql命令行(mysql -uroot -p),执行如下SQL
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 |
+--------------------------+--------------------+
注:这一步一定在数据库所在服务器上完成。
第二步,在数据库连接url中的路径字段设为
useUnicode=true&characterEncoding=UTF-8&autoReconnect=true;
本地的客户端上(如Navicat、MySQLWorkBench)可能会因为编码的问题无法显示。
在服务器的命令行下也可能会因为编码的问题无法显示,我们的目标是能正常存入,能正常取出。能正常显示。
注明:对于 JDBC 连接串设置了 characterEncoding 为 utf8 或者做了上述配置仍旧无法正常插入 emoji 数据的情况,建议在代码中指定连接的字符集为 utf8mb4
服务器:ubuntu0.16.04.1
数据库:MySQL-5.7.22-0ubuntu0.16.04.1
连接端:JDBC
外部驱动:C3P0
语言环境:JAVA
参考文档:
utf8 和 utf8mb4 的区别 : https://mathiasbynens.be/notes/mysql-utf8mb4
可参考网址:
https://blog.csdn.net/testcs_dn/article/details/75533784
https://segmentfault.com/a/1190000000616820
https://www.cnblogs.com/aksir/p/7070493.html
需要进一步解决的问题
1、为什么在客户端不能正常显示emoji表情(Nactivcat 、MySQL workbench)
Unicode 只是规定了 Emoji 的码点和含义,并没有规定它的样式。举例来说,码点U+1F600表示一张微笑的脸,但是这张脸长什么样,则由各个系统自己实现。
因此,当我们输入这个 Emoji 的时候,并不能保证所有用户看到的都是同一张脸。如果用户的系统没有实现这个 Emoji 符号,用户就会看到一个没有内容的方框,因为系统无法渲染这个码点。
参考网址:https://blog.csdn.net/zhang__ao/article/details/78061568
2、set names 的原理
SET NAMES x
相当于
SET character_set_client = x;
SET character_set_results = x;
SET character_set_connection = x;
所以说:
set names utf8mb4指定了客户端和服务器之间传递字符的编码规则为utf8mb4。
参考网址:https://blog.csdn.net/kakarot5/article/details/40088137
https://blog.csdn.net/y_h_t/article/details/17994335
3、https://dev.mysql.com/doc/refman/5.6/en/charset-unicode-utf8mb4.html
4、https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-sets.html
MySQL中的字符序名称遵从命名惯例:以字符序对应的字符集名称开头;以_ci(表示大小写不敏感)、_cs(表示大小写敏感)或_bin(表示按编码值比较)结尾。例如:在字符序“utf8_general_ci”下,字符“a”和“A”是等价的;