您的位置:首页 > 编程语言 > C语言/C++

Mysql (控制台,C++,Java,PHP等等)各种中文乱码的详细解释

2012-11-16 02:02 323 查看
与数据库字符集相关的变量有下面几个:可以用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++)也一定要支持传输过来的字符集,不支持时可以进行转换即可。

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: