当前位置: > 数据库 > MySQL >

Toad fro MySQL 6.0 的客户端中文字符编码问题

时间:2015-01-21 23:36来源:linux.it.net.cn 作者:IT

对于Mysql安装的时候如果没有设置utf8编码,而是使用了默认的latin1,则默认情况下,创建的数据库和表也默认latin1,创建表的时候显式指定utf-8也可以,也能存储中文字符。不过,如果在一个latin1的database下面访问一个utf-8的database里面的表里面的中文,同样可能出现乱码。
Toad fro MySQL 4.6 Freeware中连接设置窗口中能够设置是否使用Unicode,所以能够灵活地根据服务器上字符集的设置调整本地字符集设置,从而免除中文乱码的烦恼。

不过,最近Toad fro MySQL 5.0 Freeware版本(5.0.0.345)发布后,声称其内置Unicode支持,但是在连接我的一个测试环境的时候,查询获得的中文都没有问题,但是修改数据库的操作中涉及的中文都导致了乱码。一下是一种解决方法。

1)背景知识——MySQL的字符集设置,以下摘自网上。

mysql4.1及其之后的版本,对字符集的支持分为四个层次: 服务器(server),数据库(database),数据表(table)和连接(connection):
character_set_server:这是设置服务器使用的字符集
character_set_client :这是设置客户端发送查询使用的字符集
character_set_connection :这是设置服务器需要将收到的查询串转换成的字符集
character_set_results :这是设置服务器要将结果数据转换到的字符集,转换后才发送给客户端
整个过程:
- client(如php程序)发送一个查询;
- 服务器收到查询,将查询串从character_set_client 转换到character_set_connection,然后执行转换后的查询;
- 服务器将结果数据转换到character_set_results字符集后发送回客户端。

你可以用下边两条命令查看一下系统的字符集和排序方式设定:

mysql> SHOW VARIABLES LIKE ‘character_set_%’;

mysql> SHOW VARIABLES LIKE ‘collation_%’;

+--------------------------+---------------------------------+
| Variable_name            | Value                           |
+--------------------------+---------------------------------+
| character_set_client     | latin1                          |
| character_set_connection | latin1                          |
| character_set_database   | latin1                          |
| character_set_filesystem | binary                          |
| character_set_results    | latin1                          |
| character_set_server     | latin1                          |
| character_set_system     | utf8                            |
| character_sets_dir       | D:""share"charsets" |
+--------------------------+---------------------------------+

mysql 默认用的字符集是latin1,连接校对用的latin1-_swedish_ci。看到这儿你应试有点明白了,我们通过php发送的查询一般是utf8或者GBK,GB2312,而它默认的是latin1,所以用phpmyadmin查看或者直接进数据库里查看数据,都是一些乱码。(存取出来放在网页上大多是正常的。)phpmyadmin在对mysql4.0以下会使用内置的库来实现字符集的转换,从而支持多语言版本,而对于4.1以上则完全交给Mysql。所以以上几个层次的转换如果有字符集不匹配的情况,出现乱码就很容易理解了。说了半天,其实你只要把上述变量设置一致了,不管是直接在数据库里查看,还是在phpmyadmin里查看都不会出现中文乱码了。

假如你的系统和php网页是utf8编码,你可以将mysql的编码由默认的latin1改为utf8.

编辑mysql的配置文件,/etc/,在[mysqld]中设置default-character-set=utf8即可。不过原来的数据,假如你用4.0,mysqldump出来的数据是latin1的编码,你再导入就会出现乱码。如果你原来的数据非常宝贵,那你还是用latin1编码吧。

2)有了以上的背景知识,发现问题原因出在中文环境下Toad fro MySQL 5.0 Freeware连接服务器后,variables中显示的本地字符集为latin1,而Toad fro MySQL 4.6 Freeware勾选Unicode支持时variables中显示的是utf8。然后再看MySQL服务器上,尽管database的字符集设置的是utf8,但是character_set_system变量显示的是latin1,所以问题的原因应该是:Toad fro MySQL 5.0 Freeware连接MySQL时,会根据服务器上character_set_system或者character-set-server的设置设置本地的字符集。所以,在mysql启动的命令行中添加--default_character_set=utf8(5.1中已经不建议使用,已--character-set-server替代),重新用Toad fro MySQL 5.0 Freeware连接,问题解决。(对于linux环境下,可以在/etc/my.cnf文件中添加character-set-server=utf8)。

追加:对于mysql自带的命令行工具mysl.exe,它会读取my.ini文件中的[mysql]段下的defautl-character-set设置,所以对于中文客户端可以设置为gbk。此外,可以使用set charset gbk设置当前连接客户端使用的字符集,Toad fro MySQL 5.0 Freeware默认情况下会使用相同的连接,在设计中文字符问题的操作前使用此语句(只需要执行一次),也能凑效。

 

 

(责任编辑:IT)
------分隔线----------------------------
栏目列表
推荐内容