数据库学习8

来源:互联网 发布:松下网络摄像机默认ip 编辑:程序博客网 时间:2024/05/24 07:09

中文数据问题本质是字符集问题,计算机只识别二进制,而人类更多只识别符号,需要有个二进制与字符的对应关系(字符集)

案例:mysql> insert into my_student values(5,'itcast0005','张越',''); #插入中文数据

如上客户端向服务器插入中文数据不成功

原因:\xD5\xC5\xD4\xBD 代表的是中文'张越在当前编码(字符集)下对应的二进制编码转换成的十六进制:两个汉字等于四个字节(JBK)。报错的原因是服务器没有识别对应的四个字节,服务器认为数据是utf8(一个汉字有三个字节),读取三个字节转换成汉字(失败),剩余的再读三个字节(不够),最终导致失败.

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

查看服务器识别哪些字符集

mysql> show character set; #查看所有字符集

mysql> show variables like 'character_set%'; #查看服务器默认的对外处理的字符集

问题解析:客户端数据智能是GBK ,而服务器认为是UTF8,告诉服务器默认的接收字符集为JBK

mysql> set character_set_client = gbk; #修改服务器认为的客户端的字符集为GBK

插入中文效果:

但查看数据,依然乱码,原因:数据来源是服务器而解析数据是客户端(客户端只识别GBK,而客户端给的是utf8 所以乱码)

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

mysql> set character_set_results = gbk;

查看数据效果

set 变量 =  ;修改只是会话级别(当前客户端,当次连接有效,关闭失效)退出登陆效果如下

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

mysql> set names gbk; #等价于三步骤(character_set_client,character_set_results,character_set_connection;)

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

-- 校队集问题

校队集:数据比较的方式

校队集有三种格式:

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

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

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

mysql> show collation; #查看数据库所支持的校队集,校对集的应用:只有当数据产生比较的时候校对集才会生效,对比:使用utf8 _bin _ci 来验证效果。

创建表使用不同的校队集

mysql> create table my_collate_bin(name char(1)) charset utf8 collate utf8_bin;

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

1.创建不同校队集的

2.插入数据

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

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

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

mysql> select * from my_collate_bin order by name; #排序查找

mysql> select * from my_collate_ci order by name; #排序查找

校队集必须再没有数据之前声明好,如果有了数据再进行的话那么修改无效。

mysql> alter table my_collate_ci collate = utf8_bin;

原创粉丝点击