看到很多有关 MYSQL 乱码问题的帖子,笔者也在使用 MYSQL 的过程中遇到过,在网上看到各位高手的意见,受益菲浅,但是,有时候总是碰不到自己想要的解答,下面是我自己安装使用过程中碰到的问题,记录下来与大家一起分享。
我刚一开始安装 MYSQL 的时候还不知道字符集的问题,想当然的以为没有问题,因为笔者原来的用 MSSQL 的时候就没有遇到过这些问题,然后,笔者使用 VB6 为单位开发了一个小的 MIS 系统,都是用的缺省的字符集,程序 INSERT、SELECT 在界面显示中文都很正常,在调试的过程中用的是 MYSQL 自己带的 COMMAND LINE CLIENT,在这里面插入中文,显示都很正常。后来在用其他的软件(例如 MYSQL 自己带的 QUERY BROWSER)查询表中内容的时候是乱码,当时弄得我一头雾水,不知道怎么回事,翻阅 MYSQL 使用文档,才知道当时缺省安装的字符集合 latin1_swedish_ci,我在输入和输出的时候字符显示集合是一致的,在数据库表中的字符集是 latin1_swedish_ci,我不论是在 COMMAND LINE CLIENT,还是在程序中,输入汉字都不会发生问题,直到现在我也不明白。
再后来,听说数据的字符集最好设置成 UTF8 的,那样就能支持多语言,我一时兴趣,安装了一个 UTF8 默认字符集的 MYSQL 5.0,满怀信心的认为从 COMMAND LINE CLIENT 中输入汉字应该没有问题,因为表都是 UFT8 的了,可是 INSERT 的时候还是报 data too long 的错误,到网上查询了半天,明白了 MySQL 的字符集支持(Character Set Support)有两个方面:字符集(Character set)和排序方式(Collation)。对于字符集的支持细化到四个层次: 服务器(server),数据库(database),数据表(table)和连接(connection)。
查看系统的字符集和排序方式的设定可以通过下面的两条命令:
mysql> SHOW VARIABLES LIKE 'character_set_%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | latin1 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
7 rows in set (0.00 sec)
mysql> SHOW VARIABLES LIKE 'collation_%';
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
+----------------------+-------------------+
3 rows in set (0.00 sec)
上面列出的值就是系统的默认值。我用 SHOW VARCHARARES LIKE 'char%' 看,发现都是 UTF8 格式,这就纳闷了,怎么不行呢,难道是 CMD 自己本身的字符集有问题?查看了一下,发现 cmd.exe 自身的编码是 GBK,就用 SET NAMES 'gbk',这样一试,果然成功了。
SET NAMES 'gbk';
它相当于下面的三句指令:
SET character_set_client = gbk;
SET character_set_results = gbk;
SET character_set_connection = gbk;
最后总结一下:
1) 库、表缺省的字符集都是一致的,一般使用多字节时采用 UTF8,这样就不会丢失信息,而且有利于国际化。
2) 连接的时候,要和应用程序本身系统采用的字符集一致,这样就能正确插入和显示数据,不用管数据库中存什么字符。









