mysql> show full columns from gs_userinfo_tbl; +----------+-------------+-------------------+------+-----+---------+-------+---------------------------------+---------+ | Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment | +----------+-------------+-------------------+------+-----+---------+-------+---------------------------------+---------+ | user_id | varchar(32) | latin1_swedish_ci | NO | PRI | | | select,insert,update,references | | | nickname | varchar(32) | latin1_bin | YES | UNI | NULL | | select,insert,update,references | | +----------+-------------+-------------------+------+-----+---------+-------+---------------------------------+---------+ 2 rows in set (0.00 sec)
你的表字符集是latin1 SET NAMES latin1
你的字符集不统一,不知道你表中的内容是latin1、GBK、UTF8, 估计你要在统一的字符集下重新插入记录 select hex(有中文内容的字段名) from tt 贴结果,
你的表中的字符集设置是 latin1 ,这样显然,你插入的中文会被转换成latin1 编码来存放。如果你INSERT的时候设置也是latin1 则没有什么问题,但如果你INSERT的时候设置的是其它字符集则会产生编码的转换,从而导致乱码。99%的可能是,你现在数据库表中存储的本身就是乱码了。 找一条记录SELECT出来,看看实现的编码是什么。select nickname, HEX(nickname ) from gs_userinfo_tbl where user_id =12345677;然后把这条记录所对应的中文也贴出来。另外你的C++程序中使用的字符集设置是什么?建议你在你的程序中执行一下 show VARIABLES like 'character_set%';看看结果是什么?
看看结果
show VARIABLES like 'character_set%';再set names gb2312;
或则
SET NAME UTF8;
看看怎么样
控制台的编码set names 'xxx'表示用数据库的连接转换编码,xxx表示客户端需求的编码
MySQL 中文显示乱码
贴结果
mysql> show variables like 'char%'
-> ;
+--------------------------+---------------------------------------------------------+
| Variable_name | Value |
+--------------------------+---------------------------------------------------------+
| character_set_client | gbk |
| character_set_connection | gbk |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | gbk |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | C:\Program Files\MySQL\MySQL Server 5.1\share\charsets\ |
+--------------------------+---------------------------------------------------------+
8 rows in set (0.00 sec)
mysql> show create table gs_userinfo_tbl;
+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| gs_userinfo_tbl | CREATE TABLE `gs_userinfo_tbl` (
`user_id` varchar(32) NOT NULL DEFAULT '',
`nickname` varchar(32) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
PRIMARY KEY (`user_id`),
UNIQUE KEY `nickname` (`nickname`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+----------+-------------+-------------------+------+-----+---------+-------+---------------------------------+---------+
| Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment |
+----------+-------------+-------------------+------+-----+---------+-------+---------------------------------+---------+
| user_id | varchar(32) | latin1_swedish_ci | NO | PRI | | | select,insert,update,references | |
| nickname | varchar(32) | latin1_bin | YES | UNI | NULL | | select,insert,update,references | |
+----------+-------------+-------------------+------+-----+---------+-------+---------------------------------+---------+
2 rows in set (0.00 sec)
SET NAMES latin1
估计你要在统一的字符集下重新插入记录
select hex(有中文内容的字段名) from tt
贴结果,
找一条记录SELECT出来,看看实现的编码是什么。select nickname, HEX(nickname ) from gs_userinfo_tbl where user_id =12345677;然后把这条记录所对应的中文也贴出来。另外你的C++程序中使用的字符集设置是什么?建议你在你的程序中执行一下 show VARIABLES like 'character_set%';看看结果是什么?
+--------------+--------------------------+
| nickname | HEX(nickname ) |
+--------------+--------------------------+
| VV- | 0E560E562D |
| U?Q | 1055018051 |
| X=?D0)YX | 15583D84443029590258 |
| Q?R | 1B51D552 |
| | 20 |
| *s4Yn0???? | 2A7334596E30DD84DD84 |
| A | 41 |
| NgRKN6r | 4E671A524B4E3672 |
| S | 53 |
| a | 61 |
| eg?n?n | 65679C6E9C6E |
| h | 68 |
| p | 70 |
| s | 73 |
| v | 76 |
| wPwP?v*b?VN | 7750775084762A62FE560B4E |
| }v?ec?k?=\ | 7D76E56563886B883D5C |
| ?u?rKN?[? | AF75C2724B4E8C5B8E7F |
| ?r?P?vAml | C272B2508476416D136C |
| ??í??[ | CE98ED8BD25B |
| ????v?[k? | DE98D47F8476B35B6B86 |
+--------------+--------------------------+
21 rows in set (0.02 sec)
因为数据是别人写进去的,所以我不知道写进去的时候是什么样子,但写数据的人提供了接口可以查出来,不是乱码的,
| nickname | HEX(nickname ) |
+--------------+--------------------------+
| VV- | 0E560E562D |
| U?Q | 1055018051 |
| X=?D0)YX | 15583D84443029590258 |为什么不同时给出这三记录所对应的实际内容应该是什么?