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数据。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐