在向一个gbk字符集的字段中插入一批数据,部分数据的末尾出现一个不正常的符号,一直找不到原因,请大家帮助分析。谢谢。
先贴一下代码:
set names gbk;drop database if exists lb_gbk;
create database lb_gbk character set gbk;
use lb_gbk;show variables like '%char%';CREATE TABLE `bm` (
  `bm_id` int(10) unsigned NOT NULL auto_increment,
  `bmmc` varchar(50) NOT NULL COMMENT '部门名称',
  PRIMARY KEY  (`bm_id`)
) ENGINE=InnoDB character set = gbk;
insert into bm values (1,'gbk_abc'),(2,'gbk_生产处'),(3,'gbk_生产处a'),(4,'gbk_处室管理');
select * from bm;show full columns from bm;在插入的记录中,id为2的记录'gbk_生产处'中生产处的处字变成了一个菱形问号的字符,插入时出现警告 1 warning(s): 1366 Incorrect string value: '\x84' for column 'bmmc' at row 2,网上查了很多页面,大致分析为各项字符集设置不一致造成。但我查看字符集设置,似乎没有问题。请大家帮助找一下原因。经分析保存在数据库中的数据,发现符合utf8的储存方式,也就是说,虽然数据库表中字符的字符集是gbk,但存储过程中存入的是utf8编码字符,因为utf8编码中文是3个字节的,而gbk是2个字节的,因此当存入时出现奇数字节而这个多余的奇数字节又不能转换为ascii码的情况下,就会被截去。具体看贴图。
但问题仍没有解决。我之前是运行过set names gbk语句的,而且查看 character-set-client,character-set-connection,charter-set-results也均是gbk,数据库、数据表建立时都显式指定了字符集为gbk,但为什么最终存入数据库的还是utf8编码?按理来说这些产生乱码原因的设置全都是一致的,不应该出现这个情况。以上情况在两台linux服务器,两个不同版本的mysql上测试,都出现了上述情况。求助大家帮忙。

解决方案 »

  1.   

    直接用 mysql 命令行操作看看,是不是你用的工具的问题
      

  2.   

    同上,看了几遍没毛病,换个client试试
      

  3.   


    使用mysql客户端还是这个结果。感谢,问题的确在客户端这里。试着将ssh连接工具的字符集设置为gbk后连接 linux,然后 使用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       | /usr/local/mysql/share/mysql/charsets/ | 
    +--------------------------+----------------------------------------+
    8 rows in set (0.00 sec)mysql> create database gbk_conn character set gbk;
    Query OK, 1 row affected (0.00 sec)mysql> use gbk_conn
    Database changedmysql> create table bm (id int,bmmc varchar(50), primary key (id))character set =gbk;
    Query OK, 0 rows affected (0.00 sec)mysql> show tables;
    +--------------------+
    | Tables_in_gbk_conn |
    +--------------------+
    | bm                 | 
    +--------------------+
    1 row in set (0.00 sec)mysql> insert into bm values (1,'生产处'),(2,'组织人事处'),(3,'生产管理');
    Query OK, 3 rows affected (0.00 sec)
    Records: 3  Duplicates: 0  Warnings: 0mysql> select * from bm;
    +----+------------+
    | id | bmmc       |
    +----+------------+
    |  1 | 生产处     | 
    |  2 | 组织人事处 | 
    |  3 | 生产管理   | 
    +----+------------+
    3 rows in set (0.00 sec)mysql> show full columns from bm; 
    +-------+-------------+----------------+------+-----+---------+-------+---------------------------------+---------+
    | Field | Type        | Collation      | Null | Key | Default | Extra | Privileges                      | Comment |
    +-------+-------------+----------------+------+-----+---------+-------+---------------------------------+---------+
    | id    | int(11)     | NULL           | NO   | PRI | 0       |       | select,insert,update,references |         | 
    | bmmc  | varchar(50) | gbk_chinese_ci | YES  |     | NULL    |       | select,insert,update,references |         | 
    +-------+-------------+----------------+------+-----+---------+-------+---------------------------------+---------+
    2 rows in set (0.00 sec)mysql> select bmmc,hex(bmmc) from bm;
    +------------+----------------------+
    | bmmc       | hex(bmmc)            |
    +------------+----------------------+
    | 生产处     | C9FAB2FAB4A6         | 
    | 组织人事处 | D7E9D6AFC8CBCAC2B4A6 | 
    | 生产管理   | C9FAB2FAB9DCC0ED     | 
    +------------+----------------------+
    3 rows in set (0.00 sec)mysql> 
      

  4.   

    这个会受到连接工具本身的限制。比如,我在linux打开一个terminal,连接到mysql,设置gbk,不过怎么查,都是乱码,之所以这样是由于,的设置terminal的对应字符集,数据从mysql过来是正常的,mysql客户端接受到的也是正常的,最后显示就不正常了,问题都是在最后一公里的 工具的字符集上。