在向一个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上测试,都出现了上述情况。求助大家帮忙。
先贴一下代码:
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上测试,都出现了上述情况。求助大家帮忙。
使用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>