字符集与校对集概述
字符(character):计算机中保存的各种文字和符号。
如:各种国家的文字、标点符号、图形符号、数字等。
字符编码(character encoding):将用户输入的字符,按照一定的规则转换为二进制后保存的过程。
字符集(character set,charset):字符的编码规则组合。
Charset:字符集名称
Description:描述信息
Default collation:默认校对集
Maxlen:单字符的最大长度
由于历史原因,MySQL 中的 utf8 编码与标准的 UTF-8(RFC 3629)存在一些差别。
标准的 UTF-8 规定一个字符最多使用 4 个字节,
而 MySQL 中的 utf8 编码一个字符最多使用 3 个字节。
这导致 UTF-8 中的一些特殊字符(如 emoji 符号)无法在 MySQL 的 utf8 编码中使用。
校对集:为不同字符集指定比较和排序规则。
例如:latin1 字符集默认的校对集为“latin1swedishci”。
↑ ↑ ↑
字符集 国家名或 genera 规则
ci:不区分大小写
cs:区分大小写
bin:以二进制方式比较
Collation:校对集名称
Charset:对应的字符集
Id:校对集 ID
Default:是否为对应字符集的默认校对集
Compiled:是否已编译
Sortlen:排序的内存需求量
mysql> SHOW VARIABLES LIKE 'character%';
+--------------------------+-----------------------------+
| Variable_name | Value |
+--------------------------+-----------------------------+
| charactersetclient | gbk |
| charactersetconnection | gbk |
| charactersetdatabase | latin1 |
| charactersetfilesystem | binary |
| charactersetresults | gbk |
| charactersetserver | latin1 |
| charactersetsystem | utf8 |
| charactersetsdir | C:\mysql5.7\share\charsets\ |
+--------------------------+-----------------------------+
8 rows in set, 1 warning (0.01 sec)
charactersetserver:新创建的数据库默认使用的字符集。
数据库的字符集 决定了 数据表的默认字符集,
数据表的字符集 决定了 字段的默认字符集。
charactersetclient:客户端字符集
charactersetconnection:连接层字符集
charactersetresults:查询结果字符集
charactersetclient:客户端字符集
charactersetconnection:连接层字符集
charactersetresults:查询结果字符集
一次更改 3 个变量的值:
set names 字符集;
字符集与校对集的设置
使用 set 或 set names 修改字符集只对当前会话有效,不影响其他会话,且会话结束后,下次会话仍然使用默认值。
因此下次会话仍然需要重新执行命令。
若字段使用 utf8 字符集,而客户端使用 gbk 字符集,MySQL 会自动进行编码转换。
由于 utf8 和 gbk 本质上是不同的字符集,虽然大部分常见的字符可以转换成功,但若遇到其中一个字符集中没有的特殊字符,则可能会出现乱码。
在创建数据库时设定字符集和校对集:
[DEFAULT] CHARACTER SET [=] charset_name
[DEFAULT] COLLATE [=] collation_name
为数据表设置字符集示例
CREATE TABLE my_charset (
username VARCHAR(20)
) CHARACTER SET utf8 COLLATE utf8_bin;
简写形式
CREATE TABLE my_charset (
username VARCHAR(20)
) CHARSET utf8 COLLATE utf8_bin;
字段的字符集与校对集在字段属性中设定:
[CHARACTER SET charsetname] [COLLATE collationname]
若没有为字段设定字符集与校对集,则会自动使用数据表的字符集与校对集。
为字段设置字符集示例
CREATE TABLE my_charset (
username VARCHAR(20) CHARACTER SET utf8 COLLATE utf8_bin
);
在 mydb 数据库中创建一张用户表(user)。
在表中添加以下字段,选择合适的数据类型。
用户名:可以使用中文,不允许重复,长度 2~20 个字符。
手机号码:长度为 11 个字符。
性别:有男、女、保密 3 种选择。
注册时间:注册时的日期和时间。
会员等级:表示会员等级的数字,最高为 100。
回见
版权声明: 本文为 InfoQ 作者【在即】的原创文章。
原文链接:【http://xie.infoq.cn/article/bb5c79fb00cbf1df85f150a81】。文章转载请联系作者。
评论