lbpp 发表于 2016-11-7 11:16:47

救助:向gbk字符集字段插入中文字符,个别字符乱码的原因

在向一个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,网上查了很多页面,大致分析为各项字符集设置不一致造成。但我查看字符集设置,似乎没有问题。请大家帮助找一下原因。





小苏 发表于 2016-11-7 16:53:05


default-character-set=gbk


default-character-set=gbk

把你的客户端,跟服务端的都修改了。

插入乱码只有一种问题,那就是编码不一致,不会有其他的问题,首先需要做的是检查你的mysql的编码是否都一致,如果还是不行的情况下那你需要检查的就是,你的程序/工具的编码是不是跟你mysql数据库设置的编码一致。

小苏 发表于 2016-11-7 14:47:17

你的character_set_server和character_set_system这两个的字符集是utf-8的不是gbk的

lbpp 发表于 2016-11-7 15:05:26

本帖最后由 lbpp 于 2016-11-7 15:06 编辑

小苏 发表于 2016-11-7 14:47
你的character_set_server和character_set_system这两个的字符集是utf-8的不是gbk的
character_set_server和character_set_system这两个值应该不影响的。一个是服务器默认字符集,也就是建库和建表时不指定字符集的话,那么会使用这个字符集,我在建库和建表时都已经指定了字符集为gbk,所以character_set_server在此处不影响结果。另外character_set_system我的理解是指的系统的字符集,也就是说我使用的操作系统的字符集。这个也应该没有影响的吧。


如果要修改这两个值的话,应该如何操作?

lbpp 发表于 2016-11-8 10:44:46

小苏 发表于 2016-11-7 16:53

default-character-set=gbk



谢谢。

您提到的设置是对配置文件作修改。这会对重启mysql服务后的默认字符集产生影响。这方法我也试过,不能解决问题。

刚才我又对问题进行了分析。
原因基本分析清楚了,数据库表中字符的字符集是gbk,但存储过程中存入的是utf8编码字符,因为utf8编码中文是3个字节的,而gbk是2个字节的,因此当存入时出现奇数字节而这个多余的奇数字节又不能转换为ascii码的情况下,就会被截去。具体看贴图。

但问题仍没有解决。我之前是运行过set names gbk语句的,而且查看 character-set-client,character-set-connection,charter-set-results也均是gbk,数据库、数据表建立时都显式指定了字符集为gbk,但为什么最终存入数据库的还是utf8编码?按理来说这些产生乱码原因的设置全都是一致的,不应该出现这个情况。




yflower 发表于 2016-11-8 13:19:15

字符集和校对规则有4个级别的默认设置:服务器级、数据库级、表级和连接级。
你的character_set_server还是utf8,你需要检查并将你需要的字符集及校对规则修改一致。

参考自:MySQL的字符集和校对 http://www.data.5helpyou.com/article332.html

lbpp 发表于 2016-11-9 08:32:38

yflower 发表于 2016-11-8 13:19
字符集和校对规则有4个级别的默认设置:服务器级、数据库级、表级和连接级。
你的character_set_server还 ...

已将服务器字符集设置为gbk了,但问题还是没有解决。

页: [1]
查看完整版本: 救助:向gbk字符集字段插入中文字符,个别字符乱码的原因