1、查看MySQL编码
语法:SHOW VARIABLES LIKE 'char%';
因为当初安装时指定了字符集为UTF8,所以所有的编码都是UTF8。
● character_set_client:无论客户端传递的是什么编码的数据,服务器都当成该编码来处理,例如该编码为UTF8,那么如果客户端发送过来的数据不是UTF8,那么就会出现乱码;
● character_set_connection:通过该编码与client一致!该编码不会导致乱码!当执行的是查询语句时,客户端发送过来的数据会先转换成connection指定的编码。但只要客户端发送过来的数据与client指定的编码一致,那么转换就不会出现问题;
● character_set_database:数据库默认编码,在创建数据库时,如果没有指定编码,那么默认使用database编码;
● character_set_filesystem:可以理解为文件的最终存储形式,是二进制形式的;
● character_set_server:MySQL服务器默认编码;
● character_set_results:MySQL会把数据转换成该编码后,再发送给客户端,例如该编码为UTF8,那么如果客户端不使用UTF8来解读,那么就会出现乱码,说明客户端必须使用result指定的编码来解码;
● character_set_system:这个值总是utf8,不需要设置,是为存储系统元数据的编码。
附:元数据就是用来定义数据的数据(data about data ,关于数据的数据)。比如,有一条学生信息记录,其中包括字段姓名(name)、年龄(age)、性别(male)、班级(class)等,那么name、age、male、class就是元数据。
2、控制台编码
我们使用控制台的时候经常出现乱码问题,例如:
● 插入或修改时出现乱码:
这是因为DOS下默认使用GBK,而character_set_client不是GBK的原因。又因为修改DOS的编码不方便,所以我们去设置character_set_client为GBK即可。
● 查询出的数据为乱码:
这是因为character_set_results不是GBK,而DOS默认使用GBK的原因。因为修改DOS的编码不方便,所以我们去设置character_set_results为GBK即可。
我们的DOS系统默认编码是GBK,这是和我们的操作系统相关的,无法改变为UTF8,这就出现一个问题。客户端发送的数据是GBK,而character_set_client为UTF8,这就说明客户端数据到了服务器端后一定会出现乱码。既然不能修改控制台的编码,那么只能修改character_set_client为GBK了。
服务器发送给客户端的数据编码为character_set_result,它如果是UTF8,那么控制台使用GBK解码也一定会出现乱码。因为无法修改控制台编码,所以只能把character_set_result修改为GBK。
● 解决方法:
但是要注意的是:这种设置编码方式只对当前连接有效,这说明每次登录MySQL提示符后都要去修改这两个编码,但可以通过修改配置文件来处理这一问题:配置文件路径:\MySQL\MySQL Server 5.1\ my.ini,设置:
原理:在[ client ] 处设置后,实际效果是改变了三处编码,如下:
3、MySQL工具
当使用MySQL工具,例如SQLyog,是不会出现乱码的,因为它们会每次连接时都会修改character_set_client、character_set_results、character_set_connection的编码。这样对my.ini上的配置覆盖了,也就不会出现乱码了。
小结:了解各种编码的意义是解决mysql编码的关键。