如何解决emoji表情插入MySQL数据库问题

问题描述:

当存储含有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”是等价的;

你可能感兴趣的:(如何解决emoji表情插入MySQL数据库问题)