Mysql学习历程基本语法(5)--中文数据问题

来源:互联网 发布:淘宝一元包邮的店 编辑:程序博客网 时间:2024/06/09 14:39

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


\xD5\xC5\xD4\xBD代表"张越在"当前编码下对应的二进制编码转换成的十六进制:两个汉字对应四个字节 GBK

错误原因:服务器没有识别对应的四个字节,服务器认为数据是UTF8,一个汉字对应三个字节;

所有数据服务器认为(表现)的一些特性,都是通过服务器端的变量来保存;系统先读取自己的变量看应该怎么表现;

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

服务器识别这么多字符集,总有一种是服务器默认的和客户端打交道的字符集show variables like 'character_set%' ;     show variables like '%character%';     show variables like '%collation%';

显示结果:variable_name       value

character_set_client          utf8      服务器默认客户端来的数据字符集UTF8

character_set_connection utf8 连接层字符集

character_set_database utf8 当前所在数据库字符集

character_set_filesystem binary

character_set_results utf8 服务器默认给外部数据的字符集

问题根源:客户端数据只能是gbk  而服务器认为是utf8;产生矛盾  

解决方案:改变服务器默认的接受字符集为gbk     

set  character_set_client=gbk;

查看数据是乱码,原因:数据来源是服务器,解析数据是客户端,客户端只会识别gbk,但是实时服务器给的数据是utf8(三个字节代表一个数字) 

解决方案:修改服务器给客户端的数据字符集为gbk

set   character_set_results=gbk;


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

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

set  names gbk;==>character_set_client     character_set_connectioncharacter_set_results

connection连接层:是字符集转变中间者,统一了效率更高;


校对集问题

校对集:数据比较的方式

校对集三种格式   _bin:binary 二进制比较,区分大小写

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

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

查看所有校对集show collation;

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

对比:使用utf8_bin和utf8_general_ci来验证不同的校对集效果

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

2.插入数据(此时校对集不立即生效)

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


例子:create table my_collate_bin(name char(1)) charset utf8 collate utf8_bin;

  create table my_collate_ci(name char(1)) charset utf8 collate utf8_general_ci;

    insert  into  my_collate_bin values ('a'),('A'),('b'),('B');

    insert  into   my_collate_ci  values ('a'),('A'),('b'),('B');

select  *  from   my_collate_bin   order by name;

select  *  from   my_collate_ci   order by name;


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



原创粉丝点击