SQL: show variables like '%character%'
+--------------------------+-----------------------------------------------+| Variable_name | Value |
+--------------------------+-----------------------------------------------+
| character_set_client | gbk |
| character_set_connection | gbk |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | gbk |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | D:\wamp\bin\mysql\mysql5.5.16\share\charsets\ |
+--------------------------+-----------------------------------------------+
上面就是所有关于Mysql中字符集的设置,相信弄懂的了上面的变量的含义,就再也不会有什么数据乱码的烦恼了吧
character_set_client,character_set_connection,character_set_result
这三个变量, 分别告诉MySQL 客户端的编码集, 在传输给MySQL服务器的时候的编码集, 以及期望MySQL返回的结果的编码集,
我们要想得到正确编码的数据,首它们的编码集应该一样,而设置编码上面三个变量编码集一样有一个快捷方法:
set names utf8
执行上面的那个命令,可以一次将 character_set_client,character_set_connection,character_set_result
三个变量都设置成 UTF-8 的编码,
然后我们要得到正解编码的数据,还要知道数据库的编码方法,也就是上面设置的 character_set_database,这只是数据库的默认编码,而
我们知道存放数据的是表,所以我们要以表中的字符为基准,如果不设置表的字符集的话,会继承数据库字符集
所以如果数据库出现乱码的情况下,我们就看一下上面的四种情况下的编码是不是一样
对于Java中,执行Set names utf8 并不以解决乱码问题,而其中解决的办法是改变连接串,在连接字符串中指定字符集:
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/xsgl?useUnicode=true&characterEncoding=UTF-8","root","root");
这个字符集指定的是character_set_client ;character_set_connection 的编码是utf8,而并没有指定 character_set_results 的编码为空,
所以现在存放数据库应该没问题,但如果取出,还要将 character_set_results 的编码与应用程序的编码(控制台、Java等)相同
http://hi.baidu.com/dburu/blog/item/67b0958bff8b5fdbfd1f108c.html