1 MySQL数据库编码解析
登录MySQL之后,输入如下命令来查询数据库编码,
show variables like "char%";
可得到如下查询结果,
查询结果所含信息如下,
①character_set_client:utf8,表示MySQL的客户端采用的是utf8编码,即:对于MySQL客户端将要向MySQL服务器端发送过来的SQL请求内容,客户端会采用utf8字符集编码规则进行编码发送。
PS:通常,在命令行窗口(CMD)中进行SQL查询时,如果结果集中包含中文汉字,就会显示乱码,这是由于此时作为MySQL客户端的CMD默认采用GBK编码格式,而MySQL服务器端是以utf8编码格式发送数据,就造成了乱码的出现。
②character_set_connection:utf8,表示连接MySQL数据库时采用的是utf8编码格式;
③character_set_database:utf8,表示创建MySQL数据库时默认采用utf8编码格式;
④character_set_results:utf8,表示数据据库返回给客户端查询结果时采用的编码格式;
⑤character_set_server:utf8,表示MySQL服务器安装时采用的默认编码格式,不建议人为修改;
⑥character_set_system:utf8,表示数据库系统使用的编码格式,是存储元数据时采用的编码格式,无需设置;
⑦character_set_dir:指向字符集安装的目录位置。
其中,三个系统变量不会影响到是否乱码的问题,包括:character_set_filesystem,character_set_system,character_set_dir,而只需要关注其它几个变量是否符合要求。
2 SQL查询过程中的编码格式转换
如上图所示,由MySQL客户端向MySQL服务器端发送SQL查询请求,并由MySQL服务器端接受请求,返回查询结果。在这个过程中,
3MySQL字符集和排序规则举例
以创建数据表为例,需要为每一个新的字段指定字符集和排序规则,如下图所示,
其中,
(1)每一种字符集都对应着一套具体的编码规范,如果在只包含客户端和服务器双方的消息传递过程中,双方采用的字符集不一致,就会造成双方解码失败,造成乱码。
(2)排序规则指定了在指定字符集下,字符以及序列的排序规则,通常有一些固定的命名规范。以MySQL中的utf8字符集为例,如下图所示,例如:_ci结尾表示大小写不敏感(caseinsensitive),_cs表示大小写敏感(case sensitive),_bin表示二进制的比较(binary)。
4 MySQL的字符集和排序规则
MySQL中对于字符集的支持细化到4个层次:服务器(Server)、数据库(database)、数据表(table)和数据库连接(connection)。
而排序规则定义了字符之间如何比较(大小、等值判断)的规则,每一个字符集都需要对应着一组(至少一个)排序规则。这个在3中也已经通过例子进行介绍。
5 MySQL字符集/编码格式的修改
通过以上的介绍,可以得知:设若MySQL客户端和MySQL服务器端采用的字符集不一致,就会导致乱码问题的出现。
以CMD窗口为例,倘若通过CMD命令行方式连接MySQL服务器,此时,CMD就成为MySQL服务器的客户端之一,但是CMD默认采用ASCII(中文GBK编码格式),是不可修改的,而如下图所示,此时MySQL服务器端的返回结果集采用的是utf8编码格式,下面尝试进行SQL查询。
SQL查询语句为:select * from emp;,查询结果中显示为中文乱码,
为了避免遇到中文乱码的情况,就需要对MySQL的编码格式进行修改,主要修改的就是MySQL客户端(character_set_client)、连接(character_set_connection)、结果集(character_set_results)3者的字符集进行设置,设置的方法由以下两种,
(1)临时性设置,即:只在当前窗口内有效,窗口关闭后再重新打开,编码格式还是原先的utf8编码格式。
set character_set_XXX = “gbk”;
(2)永久性设置-修改安装目录下的配置文件my.ini。{51-57行内容}
[client]
port=3306
[mysql]
default-character-set=utf8
将default-character-set的值修改为utf8或者gbk即可。
6 MySQL在CMD窗口下的乱码问题解决示例
一般情况下,MySQL的乱码问题只存在于CMD窗口中,原因:在进行JavaWeb项目开发时,Java语言默认支持的就是utf-8编码格式,几乎不会用到GBK编码。
根据2中SQL查询过程可知,返回到客户端CMD窗口(默认支持GBK编码格式,也无法修改)的数据最终采用的是character_set_results编码格式,那么想要在CMD窗口中不出现乱码,就可以采用临时性的设置,命令如下,
set character_set_results = "gbk";
再次执行相同的SQL查询,查询结果如下,中文不乱码。
关闭CMD再重新查看时,又变为utf8,则产生中文乱码。