Mysql的UTF8字符集不是标准的UTF8字符集!
行业定义中的UTF8是4个字节组成的字符集,所有的前后端开发语言也都是按这个标准执行的,但是Mysql却特立独行,它支持的utf8字符集是3个字节的。OMG!坑人坑的悄无声息。但Mysql也不是知错不改,它添加了一个utf8mb4字符集,用来支持4字节的utf8,用来和行业并轨。所以在mysql中定义utf8时,一定要选择utf8mb4!一定要选择utf8mb4!一定要选择utf8mb4!
下面讲如何设置,让整个流程都是正常运行的。
1.修改mysql数据库配置
打开mysql配置文件my.cnf(windows为my.ini),修改对应配置项,若没有该配置项则添加
INI
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
1
2
3
4
5
6
7
8
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
保存后重启数据库。
2.JDBC连接
若jdbc的url中有参数characterEncoding=utf8,则要把该参数去掉。原因有二:
因为若设置成utf8,则mysql认为会话中使用的就是utf8字符集,而非utf8mb4。
jdbc采用Java中的Charset来构造jdbc请求中的字符集,而Java中并没有utf8mb4这个字符集,所以也不能把characterEncoding设置成utf8mb4,否则报错。
3.Mysql客户端程序
按上两步设置后,java端已能正常存取4自己的utf8数据。这里再讲下客户端程序。
笔者使用的是mysql workbench客户端软件,发现workbench中依然无法存取4字节数据。用show variables like ‘%char%’; 命令查看后,发现character_set_client、character_set_connection、character_set_results依旧是utf8,也找不到统一设置的地方。
无奈只好通过命令把参数都设置一遍
set character_set_client=’utf8mb4′;
set character_set_connection=’utf8mb4′;
set character_set_results=’utf8mb4′;
最后终于可以正常存取4字节utf8数据。