关于MySQL字符集和校对集问题

字符集

一、字符集基础知识

  • 数据在计算机的最终存储一定是二进制: 但是计算机内部的存储都是字节为基本单位: 最小单位是位(bit)只有两个状态0或者1. 但是表示的数据太少, 计算机都是以字节为操作单位.
  • 字符集: 字符的集合, 用户在计算机中所能看到的任何一个不可被拆分的符号.计算机不能存储图形符号: 只能使用二进制来代表图形符号.
  • 计算机的存储数据的基本单位字节: 一个字节 = 8位(bits) = 2 ^ 8种状态 = 256种
  • 英文环境下: 达不到256中符号: 美国制定了一套规则: 规定了一个字节存储的二进制转换成十进制之后对应的是什么符号: ASCII: 维护了字符(英文)与二进制的一个对应关系.
  • 中国以汉字为符号: 常用的汉字有5K多, 一个字节不够存储: 中国定制了一个规则: 使用2个字节来表示中文字符: 2字节 = 16位 = 256 * 256 = 65536种状态(GBK==>GB2312===>big5)
  • 世界范围内: 除了汉字还有很多其他国家的符号, 全世界的符号加起来超过了65536种, 使用三个字节(unicode ===> utf-8: 可能是2-4个字节)

二、Mysql的字符集

Mysql是c/s结构软件: 客户端 ----> 服务端(数据)

数据是由客户端进入到服务端 ---> 服务端将数据显示给客户端
如果客户端的数据进入到服务端的时候,两端的字符集不一样: 数据没有办法被正常理解(操作中断)

原因: 客户端的数据的字符集是GBK(一个汉字两个字节), 但是服务器端一定不是GBK

查看服务器所支持的所有字符集: show character set;

查看mysql服务器默认的接收数据的字符集: show variables like ‘character_set%’;

客户端不能插入中文数据的原因: 客户端是GBK, 服务端认为的客户端是utf8:
客户端是不能改变(固定是GBK): 修改服务端认为的客户端的字符集(服务端支持很多字符集)

再次插入中文数据

查看数据

原因: 客户端是GBK,而服务端认为客户端可以解析的字符集utf8: character_set_results

修改服务端认为的客户端的解析字符集为GBK

set character_set_results = GBK;

凡是使用set character_set_client%修改都是临时的(会话级别): 当前用户当次连接有效(关闭连接就失效)

有一种快捷方式能够直接一次性修改多个服务器端的默认的外部字符集

set names 字符集;

校对集

校对: 本身的比较的意思: 校对集是一种比较的集合: 当数据进行比较的时候,会自动使用校对集来进行验证,从而实现比较效果.

查看所有校对集: 一个字符集会有多个校对集

show collation;

校对集分为三种

  • _bin: binary, 二进制比较, 区分大小写
  • _cs: case sensitive, 大小写敏感(区分大小写)
  • _ci: case insensitive,大小写不敏感(不区分大小写)

比较: 两张表一张使用_bin一张使用_ci

插入数据

比较数据: 使用order by对字段进行排序: 比较的过程(校对集)
Order by 字段名 [asc|desc]; asc是默认的: 升序; desc是降序

校对集必须在表一开始的时候就设置好: 后期修改无效(如果表中已经有数据)

原文地址:https://www.cnblogs.com/chenjiacheng/p/6522547.html