读mysql数据库中的中文乱码

3h随然吧 2010-04-29 05:42:31
原有数据库和表都是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='????' |


...全文
580 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
3h随然吧 2010-05-05
  • 打赏
  • 举报
回复
谢谢各位!多谢交流!
3h随然吧 2010-05-05
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 wwwwb 的回复:]

这样试试:
SELECT *,UNHEX(HEX(DD)),CONVERT(UNHEX(HEX(DD)) USING gbk) FROM ttv

再不行的话,只有转换成 成VARCHAR了
[/Quote]

这个不行

wwwwb 2010-05-05
  • 打赏
  • 举报
回复
这样试试:
SELECT *,UNHEX(HEX(DD)),CONVERT(UNHEX(HEX(DD)) USING gbk) FROM ttv

再不行的话,只有转换成 成VARCHAR了
ACMAIN_CHM 2010-05-05
  • 打赏
  • 举报
回复
不是版本问题。

一种方法就是 set names 'latin1' 之后这些字段应该就是正常的了,然后倒出,更改你的字段为 varchar后再导入。

[Quote]这个问题没有人回答吗?[/Quote]旧贴一般很少有人看。建议一次性把问题提完。

http://topic.csdn.net/u/20100428/09/BC9E0908-F250-42A6-8765-B50A82FE186A.html
3h随然吧 2010-05-05
  • 打赏
  • 举报
回复
这个问题没有人回答吗?

是不是新版本的问题呀?
3h随然吧 2010-05-04
  • 打赏
  • 举报
回复

我现在又一批数据已经建立好了的,其中有两个字段是varbinary(255)类型的,那我怎么才能使得它正常显示呢?

乱码的显示结果如下:
id,name,level,parent,pcid
1, �й�, 1, -1, 0, 11645882
2, ������, 2, �й�, 3876633850
3, ����, 2, �й�, 3876633850
4, ������, 4, ������, 3866754442
5, ����, 4, ������, 3866754442
6, ������, 4, ������, 3866754442
7, ����, 4, ������, 3866754442

name和parent字段为varbinary(255)字段

各位高手,有没有什么办法?
不会只能改成varchar类型把?
3h随然吧 2010-05-01
  • 打赏
  • 举报
回复
嗯,明白了一些,
那varbinary 没有字符集概念,那我怎么样使得它在workbench中显示中文不乱码呢?
ACMAIN_CHM 2010-05-01
  • 打赏
  • 举报
回复
varbinary(255) 是什么类型的数据??? 是二进制串。 看一下手册中的解释。 (其实如果你能在一楼的时候就指出哪个字段乱码,估计很快你就得到答复了, 问题说明越详细,回答也会越准确!参见如何提问。(提问的智慧))

11.4.2. BINARY和VARBINARY类型
BINARY和VARBINARY类类似于CHAR和VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。



[Quote]11.4.2. BINARY和VARBINARY类型
BINARY和VARBINARY类类似于CHAR和VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。

BINARY和VARBINARY允许的最大长度一样,如同CHAR和VARCHAR,不同的是BINARY和VARBINARY的长度是字节长度而不是字符长度。

BINARY和VARBINARY数据类型不同于CHAR BINARY和VARCHAR BINARY数据类型。对于后一种类型,BINARY属性不会将列视为二进制字符串列。相反,它致使使用列字符集的二元 校对规则,并且列自身包含非二进制字符字符串而不是二进制字节字符串。例如CHAR(5) BINARY被视为CHAR(5) CHARACTER SET latin1 COLLATE latin1_bin,假定默认字符集是latin1。这不同于BINARY(5),它保存5字节二进制字符串,没有字符集或 校对规则。

当保存BINARY值时,在它们右边填充值以达到指定长度。填充值是0x00(零字节)。插入值时在右侧添加0x00 on,并且选择时不删除尾部的字节。比较时所有字节很重要,包括ORDER BY和DISTINCT操作。比较时0x00字节和空格是不同的,0x00<空格。

例如:对于一个BINARY(3)列,当插入时 'a' 变为 'a \0'。'a\0'插入时变为'a\0\0'。当选择时两个插入的值均不更改。

对于VARBINARY,插入时不填充字符,选择时不裁剪字节。比较时所有字节很重要,包括ORDER BY和DISTINCT操作。比较时0x00字节和空格是不同的,0x00<空格。

对于尾部填充字符被裁剪掉或比较时将它们忽视掉的情形,如果列的索引需要唯一的值,在列内插入一个只是填充字符数不同的值将会造成复制键值错误。

如果你计划使用这些数据类型来保存二进制数据并且需要检索的值与保存的值完全相同,应考虑前面所述的填充和裁剪特征。下面的例子说明了用0x00填充的BINARY值如何影响列值比较:

mysql> CREATE TABLE t (c BINARY(3));
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO t SET c = 'a';
Query OK, 1 row affected (0.01 sec)

mysql> SELECT HEX(c), c = 'a', c = 'a\0\0' from t;
+--------+---------+-------------+
| HEX(c) | c = 'a' | c = 'a\0\0' |
+--------+---------+-------------+
| 610000 | 0 | 1 |
+--------+---------+-------------+
1 row in set (0.09 sec)
如果检索的值必须与指定进行存储而没有填充的值相同,最好使用BLOB数据类型。

创建表时,MySQL可以默默更改BINARY或VARBINARY列的类型。参见13.1.5.1节,“沉寂的列规格变更”。

[/Quote]
3h随然吧 2010-05-01
  • 打赏
  • 举报
回复
好的,这次呢我另建了下表,使用了些测试数据。

插入文件是gbk的文件。

数据库中(console):

mysql> show create table testtable2;--------------------------------------------------------------------------------
--------------------------------+
| Table | Create Table


|
+------------+------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------+
| testtable2 | CREATE TABLE `testtable2` (
`id` int(11) DEFAULT NULL,
`owner` varbinary(255) DEFAULT NULL,
`species` varchar(20) DEFAULT NULL,
`sex` char(1) DEFAULT NULL,
`birth` date DEFAULT NULL,
`death` date DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=gbk |
+------------+------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------+
1 row in set (0.06 sec)


mysql> select * from testtable2
-> ;
+------+--------+---------+------+------------+------------+
| id | owner | species | sex | birth | death |
+------+--------+---------+------+------------+------------+
| 1 | 王磊 | yellow | f | 1993-02-04 | 1993-02-04 |
| 2 | 冯家刚 | black | m | 1993-02-04 | 1993-02-04 |
| 3 | 洪森 | white | f | 1993-02-04 | 1993-02-04 |
+------+--------+---------+------+------------+------------+
3 rows in set (0.14 sec)

workbench显示结果为:
'1', ?, 'yellow', 'f', '1993-02-04', '1993-02-04'
'2', ?, 'black', 'm', '1993-02-04', '1993-02-04'
'3', ?, 'white', 'f', '1993-02-04', '1993-02-04'



而如果`owner` varbinary(255) DEFAULT NULL,
变为 `owner` varchar(20) DEFAULT NULL,
则workbench显示结果正常:
1, 王磊, yellow, f, 1993-02-04, 1993-02-04
2, 冯家刚, black, m, 1993-02-04, 1993-02-04
3, 洪森, white, f, 1993-02-04, 1993-02-04

ACMAIN_CHM 2010-05-01
  • 打赏
  • 举报
回复
[Quote] 原有数据库和表都是GBK编码的,我用mysql console 显示中文没有问题[/Quote]
能否贴命令行工具中 一个表中的记录看一下。
3h随然吧 2010-05-01
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 kamchihau 的回复:]
其實是甚麼也不用設定的,
MYSQL提供了5種編程語言2個平臺的接口,
只要你全是用UNICODE,
甚麼語言,甚麼平臺都不會亂碼,
越是設定就越亂碼。
我自己試過到這里下載6個接口,http://www.mysql.com/products/connector/
用6個語言2個平臺對同一個MYSQL寫入讀出都不會有亂碼,
甚麼設定都沒有,信不信由人了。
[/Quote]

那要是输入文件是unicode,文件没法插入到数据库中
错误如下:
Error Code: 1366
Incorrect integer value: '��1' for column 'id' at row 1)
3h随然吧 2010-05-01
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 iihero 的回复:]
引用 11 楼 hhh3h 的回复:

引用 8 楼 wwwwa 的回复:
字符集不统一,UTF8、GBK,
连接时是否指定字符集?表、字段字符集是什么
统一字符集后,重新插入记录试试


我统一都用GBK,也还是不行

是不是:| character_set_system | utf8
system 我一直改不了,听网上高手说要改这个值为GBK的,Workbench才能显示……
[/Quote]

你说得没错,待会结贴给分,当然这是小事,意思一下。。。


这其中我发现些许不同。
前提:
1。my.in 要设置好字符集
[mysql]
default-character-set=gbk
[mysqld]
...
# The default character set that will be used when a new schema or table is
# created and no character set is defined
default-character-set=gbk

2。插入时设置 set names gbk
3. 显示前要设置set names utf8,否则没法显示,这个我实践了下,不知道为什么?

当我字段设成varchar(20)时,workbench能正常显示中文,而当字段设为varbinary(255)时,就不行了,这个不知道怎么回事?
iihero_ 2010-04-30
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 hhh3h 的回复:]

引用 8 楼 wwwwa 的回复:
字符集不统一,UTF8、GBK,
连接时是否指定字符集?表、字段字符集是什么
统一字符集后,重新插入记录试试


我统一都用GBK,也还是不行

是不是:| character_set_system | utf8
system 我一直改不了,听网上高手说要改这个值为GBK的,Workbench才能显示,

Workbench我不管了,最起……
[/Quote]
system字符集显然是不用改的。

你老老实实按照wWWWWA的说法实验一遍,一点问题都没有。
WWWWA 2010-04-30
  • 打赏
  • 举报
回复
关键是你的记录是在什么字符集下插入的,
SET NAMES GBK,
再插入记录,再取出来,看看是否正常
3h随然吧 2010-04-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wwwwa 的回复:]
字符集不统一,UTF8、GBK,
连接时是否指定字符集?表、字段字符集是什么
统一字符集后,重新插入记录试试
[/Quote]

我统一都用GBK,也还是不行

是不是:| character_set_system | utf8
system 我一直改不了,听网上高手说要改这个值为GBK的,Workbench才能显示,

Workbench我不管了,最起码让我VC代码读出来没有问题吧,都是乱码。。。
3h随然吧 2010-04-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 dqlmj2009 的回复:]
数据是怎么放进去的?
[/Quote]

数据时之前别人做好了的,我只能看到他建库使用的字符集及表字符集是GBK,表中字段的字符集是默认的


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='????' |

3h随然吧 2010-04-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 acmain_chm 的回复:]
set names 'latin1'
试一下
[/Quote]
这个我试过了,不行
WWWWA 2010-04-30
  • 打赏
  • 举报
回复
字符集不统一,UTF8、GBK,
连接时是否指定字符集?表、字段字符集是什么
统一字符集后,重新插入记录试试
军爷_010 2010-04-30
  • 打赏
  • 举报
回复
数据是怎么放进去的?
KAMCHIHAU 2010-04-30
  • 打赏
  • 举报
回复
其實是甚麼也不用設定的,
MYSQL提供了5種編程語言2個平臺的接口,
只要你全是用UNICODE,
甚麼語言,甚麼平臺都不會亂碼,
越是設定就越亂碼。
我自己試過到這里下載6個接口,http://www.mysql.com/products/connector/
用6個語言2個平臺對同一個MYSQL寫入讀出都不會有亂碼,
甚麼設定都沒有,信不信由人了。
加载更多回复(6)

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧