七、mysql在某些情况下插入数据时引起的乱码问题及校对集

1、中文数据的乱码问题

中文数据乱码的问题本质是字符集的问题,字符集指的是二进制与字符的对应关系。
案例:环境(编码为gbk(windows默认编码)的cmd窗口下),插入中文数据insert into student values(4,'六子','男');,此时就可能会出现错误(如插入的汉字字符变为了字节码),这是由于客户端和mysql服务端的编码不一致引起的,解决方案如下:

  1. 查看mysql服务器识别那些字符集,语法为:show character set;
  2. 查看mysql服务器用来处理客户端数据的默认字符集:show variables 'character_set%';
  3. 修改mysql服务器用来处理客户端数据的默认字符集(这里假设客户端的编码为gbk):set character_set_client = gbk;
  4. 但此时查询表中数据时,会发现汉字字符还是字节码,这是由于数据来源于服务器,而mysql服务器虽然是根据gbk来处理了客户端传来的数据,但是当它将数据传送给客户端时,依然是根据utf8传送的,而客户端则依据gbk解码而导致的,所以还需要进一步设置;
  5. 将服务器给客户端传值时的编码设置为gbk:set character_set_results=gbk;,至此,整个设置完成。

注: set 变量=值;这种修改方法修改的效果仅限于当前会话,也就是说,上面的步骤完成后,只在当前会话有效,如果客户端一旦关闭,下次打开时,需要重新进行设置。也可以用快捷的方式设置服务器对客户端的字符集的认知:set names 字符集;。如:set names gbk;
附: connection(连接层)是字符集转变的中间值,如果统一了效率更高,不统一也不会出错;其作用主要是用于统一服务器内部存储数据时的编码。

2、校对集

1 校对集的定义

校对集:数据表中及查询时条件数据比较的方式(如与where语句中的条件进行比较的方式)。

2 校对集的格式

校对集有三种格式,是依据后缀分的,前缀统一为"字符集(如gbk)_后缀;",如:utf8_general_ci;设置语句为:collate utf8_general_ci;
这三种格式具体如下:

  1. _bin:binary,二进制比较,取出数据的二进制,一位一位的进行比较,区分大小写;
  2. _cs:case sensitive,大小写敏感,区分大小写;
  3. _ci:case insensitive,大小写不敏感,不区分大小写。

查看mysql服务器支持的所有校对集(基本语法):show collation;
校对集的作用(作用范围):只有当操作产生比较的时候(如where语句中的条件),校对集才会产生作用。
注: 校对集必须在表中没有数据之前进行声明或者修改,一旦表中插入的数据,那么将无法进行修改(修改无效)。

3 实例:创建不同校对集的表

当在表上进行排序(order by)查找时,校对集就会生效。
分别创建校对集为utf8_general_ci的表和为gbk_chinese_ci的表:
在这里插入图片描述
在这里插入图片描述

3、web系统乱码的问题

解决web系统乱码的问题的本质还是要统一编码,但是由于客户端(浏览器)的编码和服务器(服务端和数据库)很难进行统一,所以必须借助编程语言作为中间介质,才能够很好的去解决这个问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值