对于Mysql安装的时候如果没有设置utf8编码,而是使用了默认的latin1,则默认情况下,创建的数据库和表也默认latin1,创建表的时候显式指定utf-8也可以,也能存储中文字符。不过,如果在一个latin1的database下面访问一个utf-8的database里面的表里面的中文,同样可能出现乱码。 不过,最近Toad fro MySQL 5.0 Freeware版本(5.0.0.345)发布后,声称其内置Unicode支持,但是在连接我的一个测试环境的时候,查询获得的中文都没有问题,但是修改数据库的操作中涉及的中文都导致了乱码。一下是一种解决方法。 1)背景知识——MySQL的字符集设置,以下摘自网上。
mysql4.1及其之后的版本,对字符集的支持分为四个层次: 服务器(server),数据库(database),数据表(table)和连接(connection): 你可以用下边两条命令查看一下系统的字符集和排序方式设定: mysql> SHOW VARIABLES LIKE ‘character_set_%’; mysql> SHOW VARIABLES LIKE ‘collation_%’;
+--------------------------+---------------------------------+ 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) |