与数据库字符集相关的变量有下面几个:
可以用show variables like 'char%' 来查询。
mysql> show variables like 'char%';+--------------------------+----------------
| Variable_name | Value
+--------------------------+----------------
| character_set_client | gbk
| character_set_connection | gbk
| character_set_database | latin1
| character_set_filesystem | binary
| character_set_results | gbk
| character_set_server | latin1
| character_set_system | utf8
| character_sets_dir | C:/Program File
+--------------------------+----------------
8 rows in set (0.00 sec)
mysql>
其中 character_set_database 为数据库所使用的字符集。
在Mysql中字符集级别有三个层次:服务器级别,数据库级别,数据表级别,数据项级别。
当下一层没有指定时,使用上一层的级别。
比如说创建一个数据库时,没有指定数据库级别时,会使用服务器默认的级别。
数据库的级别由系统变量:character_set_system来显示。
在安装Mysql服务器时可以设置,也可以通过设置配置文件来指定。
默认是latin1.
支持中文的字符集主要有这么几个:GBK,GB2312,UTF8(UNICODE的一种)。
所以数据库中数据项的字符集如果不是这些中的一种,就无法存储汉字了。
当然由于下一级别会掩盖上一级别,所以即使服务器为latin1仍然没有关系。
如果要让客户端和服务器端通信,
character_set_client
character_set_connection
character_set_results
这三个要能够支持中文字符,即是GBK,GB2312,UTF8中的一种。
否则一定会出现乱码。
可以通过从客户端执行Sql:show variables like 'char%来查看。
这些变量控制客户端和服务器通信使用的字符集。'
这三个变量可以在客户端连接了之后进行修改,
set character_set_client 'gbk';
也可以一次性设置三个:
set names 'gbk';
在JDBC进行连接时,如果没有指定连接字符集,characterEncoding
则客户端会去查询服务器的字符集,
如果是默认的情况,服务器端是latin1。
不能进行中文字符传输,所以一定会是乱码。
如果设置了set names 'utf8';
则是一定可以进行连接传输中文的,
这里不需要和数据库中
的字符集相同。character_set_database
但是,如果是用utf8来传输的话,
那么客户端这边不支持utf8的显示,
那么就需要把它转换成可支持的显示即可。
控制台默认使用的字符集ISO8859_1
C++里可以使用多字节字符集I和UNICODE字符集,需要对utf8进行转换才能显示。
Java中使用的是UNICODE字符集。String类可以识别UTF8,不需要转换。
如果使用GBK来传输,
则在C++中使用多字节就不用转换了,
在Java中,String也能识别GBK,所以也不用转换了。
总结:
如何才能不出现中文乱码:
1,存储数据库的数据表是支持中文的字符集,一般采用UNICODE,UTF8,GBK存储较好。
2,数据库的连接也一定要采用支持中文的字符集,可以和数据库中的字符集不一致,数据库会自动完成转换;
3,显示端口语言(Java,PHP,C++)也一定要支持传输过来的字符集,不支持时可以进行转换即可。