一般在安装和设置MySQL的时候会选择将其编码格式设置为UTF8,以保证数据库在不用语言环境下的适应性。但是一般在Win下使用的时候,本机编码集却是GBK或者GB2312.这样在Win下的GBK编码输入的数据,向数据库中存储时会被按UTF8 字符集去解释,自然就造成了存入数据乱码。
解决存入数据乱码的方法是在MySQL下查看其编码集:
查询命令:show variables like “charac%”
结果显示:
分别设置Server,System和DataBase为UTF8的编码集,而Client和Results为GBK或者GB2312中文编码集,这样插入的含有中文数据的记录以及查询显示的结果就不会出现乱码了。有时候数据并非乱码,但是中文数据被查询出来的结果显示却是乱码,这是结果集设置的问题,因此需要将结果集设置为中文编码集,这样以UTF8查询出来的数据在显示的时候会按照GBK或者GB2312编码集来解释,这样就解决了显示乱码的问题。
设置Client编码表命令:set character_set_client=GB2312;
设置Results编码表命令:set character_set_results=GB2312;
综合以上两点:数据库的Server是按UTF8字符集进行编码存储,以避免在java代码中查询使用时出现乱码或者出现不必要的格式转换;而Client和Results还是根据Win下的编码集设置为GBK或者GB2312以避免在存储和显示的时候出现乱码。
测试过程如下:
对于Client和Results都是UTF8 的情形,插入含中文数据的记录结果:存入数据库的内容就是乱码
对Client进行修改,设置Client为GBK之后,存入数据不是乱码,但是显示是乱码
对Result进行设置之后,第二条记录中的乱码解决,但是由于第一条记录中本身存入的时候就是乱码,所以还需要对该乱码在代码中进行转换才可以还原出最初存入的中文数据。
在使用MYSQL的时候通常还是会显式的指定数据库及表的编码格式为UTF8,以防止在配置MYSQL的时候由于没有正确配置编码集而造成的。
例如创建时显式指定:
CREATE DATABASE IF NOT EXISTS mydb CHARACTER SET UTF8;
表的创建也是可以显示指定。
如果创建数据库的时候未正确的指定编码集,那么可以使用如下的命令进行修改:
ALTER DATABASE dbname CHARACTER SET UTF8;