MySQL社区

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 1810|回复: 6
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
1#
发表于 2016-11-7 11:16:47 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
在向一个gbk字符集的字段中插入一批数据,部分数据的末尾出现一个不正常的符号,一直找不到原因,请大家帮助分析。谢谢。
先贴一下代码:

  1. set names gbk;

  2. drop database if exists lb_gbk;
  3. create database lb_gbk character set gbk;
  4. use lb_gbk;

  5. show variables like '%char%';

  6. CREATE TABLE `bm` (
  7.   `bm_id` int(10) unsigned NOT NULL auto_increment,
  8.   `bmmc` varchar(50) NOT NULL COMMENT '部门名称',
  9.   PRIMARY KEY  (`bm_id`)
  10. ) ENGINE=InnoDB character set = gbk;


  11. insert into bm values (1,'gbk_abc'),(2,'gbk_生产处'),(3,'gbk_生产处a'),(4,'gbk_处室管理');


  12. select * from bm;

  13. show full columns from bm;
复制代码
在插入的记录中,id为2的记录'gbk_生产处'中生产处的处字变成了一个菱形问号的字符,插入时出现警告 1 warning(s): 1366 Incorrect string value: '\x84' for column 'bmmc' at row 2,网上查了很多页面,大致分析为各项字符集设置不一致造成。但我查看字符集设置,似乎没有问题。请大家帮助找一下原因。





分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享淘帖 顶 踩
推荐
发表于 2016-11-7 16:53:05 | 只看该作者
[client]
default-character-set=gbk

[mysqld]
default-character-set=gbk

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

插入乱码只有一种问题,那就是编码不一致,不会有其他的问题,首先需要做的是检查你的mysql的编码是否都一致,如果还是不行的情况下那你需要检查的就是,你的程序/工具的编码是不是跟你mysql数据库设置的编码一致。
2#
发表于 2016-11-7 14:47:17 | 只看该作者
你的character_set_server和character_set_system这两个的字符集是utf-8的不是gbk的
3#
 楼主| 发表于 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我的理解是指的系统的字符集,也就是说我使用的操作系统的字符集。这个也应该没有影响的吧。


如果要修改这两个值的话,应该如何操作?
5#
 楼主| 发表于 2016-11-8 10:44:46 | 只看该作者
小苏 发表于 2016-11-7 16:53
[client]
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编码?按理来说这些产生乱码原因的设置全都是一致的,不应该出现这个情况。




6#
发表于 2016-11-8 13:19:15 | 只看该作者
字符集和校对规则有4个级别的默认设置:服务器级、数据库级、表级和连接级。
你的character_set_server还是utf8,你需要检查并将你需要的字符集及校对规则修改一致。

参考自:MySQL的字符集和校对 http://www.data.5helpyou.com/article332.html
7#
 楼主| 发表于 2016-11-9 08:32:38 | 只看该作者
yflower 发表于 2016-11-8 13:19
字符集和校对规则有4个级别的默认设置:服务器级、数据库级、表级和连接级。
你的character_set_server还 ...

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

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|申请友链|小黑屋|Archiver|手机版|MySQL社区 ( 京ICP备07012489号   
联系人:周生; 联系电话:13911732319

GMT+8, 2024-5-5 05:49 , Processed in 0.083090 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表