日期:2014-05-16  浏览次数:20763 次

读mysql数据库中的中文乱码
原有数据库和表都是GBK编码的,我用mysql console 显示中文没有问题,但我使用mysql workbench GUI tools和拿vc程序读都是乱码。它们俩中文乱码是不一样的,workbench GUI 中数据本身没有问题,只是它说是需要UTF8编码,所以就乱码了。而vc程序读中文数据,把中文本身的编码都乱套了,后面全是问号(?)。

网上搜集了很多的资料,基本可以确定为字符集的问题。但把字符集设个遍还是搞不定。都搞了好几天了,还是不行,哪位高手帮忙解决下!谢谢!


mysql及数据库中的数据的详细信息如下:

mysql> show variables like 'char%';
+--------------------------+----------------------------------------------------
-----+
| Variable_name | Value
  |
+--------------------------+----------------------------------------------------
-----+
| character_set_client | gbk
  |
| character_set_connection | gbk
  |
| character_set_database | gbk
  |
| character_set_filesystem | binary
  |
| character_set_results | gbk
  |
| character_set_server | gbk
  |
| character_set_system | utf8
  |
| character_sets_dir | C:\Program Files\MySQL\MySQL Server 5.1\share\chars
ets\ |
+--------------------------+----------------------------------------------------
-----+

mysql> show variables like 'collation%';
+----------------------+----------------+
| Variable_name | Value |
+----------------------+----------------+
| collation_connection | gbk_chinese_ci |
| collation_database | gbk_chinese_ci |
| collation_server | gbk_chinese_ci |
+----------------------+----------------+
3 rows in set (0.00 sec)

mysql> show create table beijing;
+---------+---------------------------------
| Table | Create Table
| beijing | CREATE TABLE `beijing` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varbinary(255) NOT NULL DEFAULT '


  ' COMMENT '????¤??????
??',
  `level` tinyint(3) NOT NULL DEFAULT '0',
  `parent` varbinary(64) DEFAULT '-1
  ',
  `pcid` int(11) unsigned NOT NULL DEFAULT '0',
  `longtitude` int(11) DEFAULT '-1' COMMENT '????(NTU)',
  `latitude` int(11) DEFAULT '-1' COMMENT '????(NTU)',
  `geo` varchar(100) NOT NULL DEFAULT '',
  `admincode` int(11) unsigned NOT NULL DEFAULT '0',
  `cid` int(11) unsigned NOT NULL DEFAULT '0',
  `next` int(11) unsigned DEFAULT '0' COMMENT '??????????????CID',
  `cityid` smallint(6) NOT NULL DEFAULT '0' COMMENT '?????¨°??',
  `valid` tinyint(3) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  UNIQUE KEY `CIDIndex` (`cid`),
  KEY `NameIndex` (`name`),
  KEY `level_index` (`level`),
  KEY `admincode_index` (`admincode`),
  KEY `pcid_index` (`pcid`),
  KEY `parent_index` (`parent`),
  KEY `cityid_index` (`cityid`)
) ENGINE=InnoDB AUTO_INCREMENT=346454 DEFAULT CHARSET=gbk COMMENT='????' |




------解决方案--------------------
照你上边描述的字符集,不应该是乱码。可能当初你建表时使用UTF8进行创建的。
不过,那些comment都无所谓了。

你在C程序里,获取完连接以后,set names 'gbk'
再获取数据,应该能得到正确的中文显示。前提是数据是在gbk编码下进行插入的。

------解决方案--------------------
在你的 mysql workbench GUI tools和拿vc程序 中也先支持一下命令 set names 'gbk';
------解决方案--------------------
关键是你的记录是在什么字符集下插入的,
SET NAMES GBK,
再插入记录,再取出来,看看是否正常
------解决方案--------------------
其實是甚麼也不用設定的,
MYSQL提供了5種編程語言2個平臺的接口,
只要你全是用UNICODE,
甚麼語言,甚麼平臺都不會亂碼,
越是設定就越亂碼。
我自己試過到這里下載6個接口,http://www.mysql.com/products/connector/
用6個語言2個平臺對同一個MYSQL寫入讀出都不會有亂碼,