MySQL字符集

##字符集概述

字符集是一套符号和编码的规则,不论是在 Oracle 数据库还是在 MySQL 数据库,都存在字符集的选择问题,而且如果在数据库创建阶段没有正确选择字符集,那么可能在后期需要更换字符集,而字符集的更换是代价比较高的操作,也存在一定的风险,所以,在应用开始阶段,就按照需求正确的选择合适的字符集,避免后期不必要的调整。


自己的理解:比如说我们输入一个汉字「汉」,用了 UTF8这种字符集,那么在UTF8这种字符集里面就有「汉」对应的四个字节表示的二进制,计算机是能够识别这些二进制的,但是不能够识别汉字,因此就有了字符集。(汉字有那么多,想想这个工作量还挺大的)


字符集有很多种,我比较熟悉的有 ASCII , LATIN1 , GBK , UTF8
ASCII 码用一个字节来表示字符,因此可以表示的字符非常有限
GBK 字符集:支持中文
UTF8 字符集:Unicode 字符集的一种,是计算机科学领域里的一项业界标准

##MySQL 支持的字符集

MySQL 服务器可以支持多种字符集,我们可以通过下面命令查看

1
show character set;


MySQL 在同一台服务器,同一个数据库,甚至同一表的不同字段都可以指定使用不同的字符集,相比 Oracle 等其他数据库管理系统,在同一个数据库只能使用相同的字符集,MySQL 明显存在更大的灵活性。
MySQL 字符集包括字符集和校队规则两个概念。字符集是用来定义 MySQL 存储字符串的方式,校对规则是定义了比较字符串的方式「大小写」。字符集和校对规则是一对多的关系。
可以通过下面的命令查看某个字符集对应的校对规则

1
show collation like 'utf8%'


校对规则特征

1.每个字符集都会有一个默认的校对规则
2.两个不同的字符集不能有相同的校对规则
3.校对规则命名约定:以相关的字符集名开始,中间包括一个语言名,并且以 _ci「大小写不敏感」、 _cs「大小写敏感」或 _bin 「二元」
从上图中可以看到UTF8的默认校对规则是 utf8_general_ci

##选择合适的字符集

建议在能够完全满足应用的前提下,尽量使用小的字符集。因为更小的字符集意味着能够节省空间、减少网络传输字节数,同时由于存储空间的较小间接的提高了系统的性能。
有很多字符集可以保存汉字,比如 UTF8GB2312GBK 等。根据应用的需要来选择, GB2312 字库比 GBK 字库小,有些偏僻字不能保存。

UnicodeUTF-8 有何区别,找个一篇很好的文章,点击这里
简单来说 Unicode 是「字符集」,为每一个「字符」分配一个唯一的ID(码位);UTF-8 是「编码规则」,将「码位」转换为字节序列的规则「编码/解码 可以理解为 加密/解密 的过程」

##MySQL字符集的设置

MySQL的字符集和校对规则有4个级别的默认设置:服务器级、数据库级、表级和字段级。
服务器字符集和校对,在MySQL服务启动的时候确定。
可以在my.cnf中设置:
[mysqld]
default-character-set=utf8
或者在启动选项中指定:
mysqld –default-character-set=utf8
或者在编译的时候指定:
./configure –with-charset=utf8

现在做的项目是在启动的时候进行配置的



修改数据库字符集

1
ALTER DATABASE db_name DEFAULT CHARACTER SET character_name [COLLATE ...];

把默认表的字符集和所有字符列改为新的字符集:

1
2
ALTER TABLE tbl_name CONVERT TO CHARACTER SET character_name [COLLATE ...] 
ALTER TABLE users CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

修改字段的字符集:

1
2
ALTER TABLE tbl_name CHANGE c_name c_name CHARACTER SET character_name [COLLATE ...];  
ALTER TABLE users CHANGE type name CHARACTER SET utf8 COLLATE utf8_general_ci;
坚持原创技术分享,您的支持将鼓励我继续创作!攒点碎银娶媳妇!