一.基本概念
位:数据存储的最小单位,二进制的0或1就是1个位。
字节:8位等于一个字节。
字符集(又名字符):字符集是各种符号的集合,比如数字1,2,3 ,字母a,b,c,d等等。
校对集:校对集是字母和符号的校对标准。校对集影响着字符的排序和搜索。
字节和字符区别:字节是数据存储的单位,而字符是各种符合的集合。
编码:将“字符”变为1个或多个"字节"的过程。
解码:与编码的过程相反。
编码方式:按某种方式将“字符”变为"字节"。 常见的方式有:ascii编码,utf-8编码,gbk编码,unicode编码。
二.中文编码方式
常见中文编码方式:
- GBK:英语字母和数字以一个字节,汉字以2个进行编码。
- Unicode: 字符集只是给所有的字符一个唯一编号,但是却没有规定如何存储。
- UTF-8:英语字母和数字以一个字节,大部分汉字以3个进行编码。
Unicode和UTF-8来源:当年ISO组织为了把各个国家的编码标准统一起来,制定了Unicode编码,把所有的字符都给定了唯一的编号,但没有给定如何储存。一个编号为 65
的字符,只需要一个字节就可以存下,但是编号 40657
的字符需要两个字节的空间才可以装下,而更靠后的字符可能会需要三个甚至四个字节的空间。这时,用什么规则存储 Unicode 字符就成了关键,我们可以规定,一个字符使用四个字节存储,也就是 32 位,这样就能涵盖现有 Unicode 包含的所有字符,这种编码方式叫做 UTF-32(UTF 是 UCS Transformation Format 的缩写)。UTF-32 的规则虽然简单,但是缺陷也很明显,假设使用 UTF-32 和 ASCII 分别对一个只有西文字母的文档编码,前者需要花费的空间是后者的四倍(ASCII 每个字符只需要一个字节存储)。为了解决这个问题,引入了UTF-8编码,
U+ 0000 ~ U+ 007F: 0XXXXXXX
U+ 0080 ~ U+ 07FF: 110XXXXX 10XXXXXX
U+ 0800 ~ U+ FFFF: 1110XXXX 10XXXXXX 10XXXXXX
U+10000 ~ U+1FFFF: 11110XXX 10XXXXXX 10XXXXXX 10XXXXXX
可以看到,UTF-8 通过开头的标志位位数实现了变长。对于单字节字符,只占用一个字节,实现了向下兼容 ASCII,并且能和 UTF-32 一样,包含 Unicode 中的所有字符,又能有效减少存储传输过程中占用的空间。
所以可以得出结论:UTF-8是Unicode编码的具体存储实现,Unicode 不是单个编码,只有提 UTF-8/16/32 编码的字节数才有意义。
三.字符集的操作
--建student表,指定字符集
create table student(
id int not null auto_increment primary key;
name varchar(10) not null
) engine = innodb charset=utf8 ;
--改变字符集
alter table student charset =gbk;
--查询Mysql支持的字符集
show character set;
--查询Mysql支持的校对集
show collation;