中文数据问题本质是字符集问题
\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;
注意:校对集必须在数据没有之前声明好,如果有了数据,再进行校对集修改,修改无效;