mysql中文乱码(字符集)问题及校对集

中文数据问题

中文数据问题本质是字符集问题;

计算机只能识别二进制:人类更多是识别符号,需要有个二进制与字符的对应关系(字符集),

客户端向服务器插入中文数据:没有成功


原因: \xD5\xC5\xD4\xBD代表的是’张越’ 在当前编码(字符集)下对应的二进制编码转换成十六进制:两个汉字->四个字节(GBK)


报错:服务器没有识别对应的四个字节:服务器认为数据是UTF8,一个汉字有三个字节,读取三个字节转换成汉字(失败),剩余的再读三个字节(不够),最终失败.

所有的数据库服务器认为(表现)的一些特性都是通过服务器的变量来保存:

系统先读取自己的变量,看看应该怎么表现.

//查看服务器到底识别哪些字符集:  show  character set;

服务器基本上的字符集都支持;

//既然服务器识别那么多:总有一种是服务器默认的跟客服端打交道的字符集

show  variable  like  'charcter_set%';


问题根源:客户端数据只能是GBK,而服务器认为是UTF8,矛盾产生

解决问题:改变服务器,默认是接收字符集为GBK

set character_set_client=gbk;


插入中文的效果:


查看数据效果:依然是乱码


原因:数据来源服务器,解析数据是客服端(只识别GBK,只会两个字节一个汉字,但是事实服务器给的数据却是UTF8,三个字节一个汉字:所有乱码)

解决方案:这时我们对服务器给客户端的数据字符集进行改GBK;

set character_set_results=gbk


查看效果:


Set  变量 = 值;修改只是会话级别(当前客户端,单次连接有效;关闭失效)


设置服务器对客户端的字符集的认知:可以使用快捷方式:set  names 字符集

Ste names gbk==>把下面三条件的都改了

character_set_client =gbk,

character_set_results=gbk,

character_ste_connenction=gbk.



Connection  连接层:是字符集转变的中间者,如果统一了效率更高,不统一也没问题;

校对集问题

校对集:数据比较的方式

校对集有三种格式

_bin: binary,二进制比较,取出二进制,一位一位的比较,区分大小写

_cs: case sensitive, 大小写敏感,区分大小写

_ci: case insensitive,大小写不敏感,不区分大小写

查看数据库所支持的校对集: show  collation;


校对集的应用: 只有当数据产生比较的时候才会生效


一般默认  _ci:不区分大小写

对比:使用utf8的_bin和_ci来验证不同的校对集的效果

1.   创建不同校对集对应的表

Create table my_collate_bin( name char(2) ) charset utf8 collate utf8_bin;

Create table my_collate_ci( name  char(2)) charset utf8 collate  utf8_general_ci;


2.  插入数据

Insert  into my_collate_bin  values(‘a’),(‘A’),(‘b’),(‘B’);

Insert into my_collate_ci  values(‘a’),(‘A’),(‘b’),(‘B’);


3.  比较:根据某个字段进行排序:order  by 字段名 [asc | desc];asc升序,desc降序默认是asc

排序查找


校对集:必须在没有数据之前声明好,如果有了数据,再修改校对集是无效的;

alter table my_collate_ci  collate=utf8_bin;


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值