Mysql字符集

一、mysql字符集

1.1 字符集种类

1.1.1 ASCII

        共收录128个字符,包括空格、标点符号、数字、大小写字母和一些不可见字符。由于总共才128个字符。

1.1.2 ISO8859-1

 共收录256个字符,是在 ASCII 字符集的基础上又扩充了128个西欧常用字符(包括德法两国的字母),也可以使用1个字节来进行编码。这个字符集也有一个别名 latin1 。

1.1.3 GB2312

 汉字以及拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母。其中收录汉字6763个,其他文字符号682个。

1.1.4 GBK

GBK 字符集只是在收录字符范围上对 GB2312 字符集作了扩充,编码方式上兼容 GB2312 。

1.1.5 utf8 

收录地球上能想到的所有字符,而且还在不断扩充。这种字符集兼容 ASCII 字符集,采用变长编码方式,编码一个字符需要使用1~4个字节utf8 字符集需要使用1~4个字节,但是一般使用1~3个字节就可以表示了。而在 MySQL 中字符集表示一个字符所用最大字节长度在某些方面会影响系统的存储和性能,所以设计
MySQL 的大叔偷偷的定义了两个概念:
utf8mb3 :阉割过的 utf8 字符集,只使用1~3个字节表示字符。
utf8mb4 :正宗的 utf8 字符集,使用1~4个字节表示字符。
MySQL 中 utf8 是 utf8mb3

1.1.6 字符集占用字节数

二、mysql字符集及排序

2.1 默认规则

utf8 字符集默认的比较规则就是:utf8_general_ci 。

2.2 MySQL 有4个级别的字符集和比较规则

服务器级别
数据库级别
表级别
列级别

2.3 各级别字符集和比较规则小结

我们介绍的这4个级别字符集和比较规则的联系如下:
如果创建或修改列时没有显式的指定字符集和比较规则,则该列默认用表的字符集和比较规则
如果创建或修改表时没有显式的指定字符集和比较规则,则该表默认用数据库的字符集和比较规则
如果创建或修改数据库时没有显式的指定字符集和比较规则,则该数据库默认用服务器的字符集和比较规则

****使用最细化的字符集和比较规则:列>表>数据库>服务器****

2.4 编码和解码使用的字符集不一致的后果

2.4.1从请求到响应字符集转变过程 

客户端使用操作系统的字符集编码请求字符串,向服务器发送的是经过编码的一个字节串。
服务器将客户端发送来的字节串采用 character_set_client 代表的字符集进行解码,将解码后的字符串再按照 character_set_connection 代表的字符集进行编码
如果 character_set_connection 代表的字符集和具体操作的列使用的字符集一致,则直接进行相应操作,否则的话需要将请求中的字符串从 character_set_connection 代表的字符集转换为具体操作的列使用的字符集之后再进行操作。(与列字符集不同则转化为相同后操作)
将从某个列获取到的字节串从该列使用的字符集转换为 character_set_results 代表的字符集后发送到客户端。客户端使用操作系统的字符集解析收到的结果集字节串。
在这个过程中各个系统变量的含义如下:

系统变量|描述
character_set_client :服务器解码请求时使用的字符集|
character_set_connection :服务器处理请求时会把请求字符串从 character_set_client 转为
character_set_connection。 
character_set_results :服务器向客户端返回数据时使用的字符集。
一般情况下要使用保持这三个变量的值和客户端使用的字符集相同。

①  操作系统字符集 widnows:GBK?linux:utf8

②  character_set_client 、 character_set_connection 、character_set_results

我们知道字符 '我' 在 utf8 字符集编码下的字节串长这样: 0xE68891 ,如果一个程序把这个字节串发送到另一个程序里,另一个程序用不同的字符集去解码这个字节串,假设使用的是 gbk 字符集来解释这串字节,解码过程就是这样的:
1. 首先看第一个字节 0xE6 ,它的值大于 0x7F (十进制:127),说明是两字节编码,继续读一字节后是0xE688 ,然后从 gbk 编码表中查找字节为 0xE688 对应的字符,发现是字符 '鎴'
2. 继续读一个字节 0x91 ,它的值也大于 0x7F ,往后读一个字节发现木有了,这是半个字符。
3. 所以 0xE68891 被 gbk 字符集解释成一个字符 '鎴' 和半个字符。
可见,如果对于同一个字符串编码和解码使用的字符集不一样,会产生意想不到的结果,作为人类的我们看上去就像是产生了乱码一样。

navicat之类的,这些工具可能会使用自定义的字符集来编码发送到服务器的字符串,而不采用操作系统默认的字符集;

如果你想在启动客户端的时候就把 character_set_client 、 character_set_connection 、
character_set_results 这三个系统变量的值设置成一样的,那我们可以在启动客户端的时候指定一个叫default-character-set 的启动选项,比如在配置文件里可以这么写:
[client]
default-character-set=utf8
gbk_chinese_ci:不区分大小写
gbk_bin: 区分大小写

2.5 总结

1. 字符集 指的是某个字符范围的编码规则。
2. 比较规则 是针对某个字符集中的字符比较大小的一种规则。
3. 在 MySQL 中,一个字符集可以有若干种比较规则,其中有一个默认的比较规则,一个比较规则必须对应一个字符集。

三、 查看 MySQL 中查看支持的字符集和比较规则的语句如下:

SHOW (CHARACTER SET|CHARSET) [LIKE 匹配的模式];
SHOW COLLATION [LIKE 匹配的模式];

四. MySQL有四个级别的字符集和比较规则

4.1 服务器级别

character_set_server 表示服务器级别的字符集, collation_server 表示服务器级别的比较规则。

4.2 数据库级别

创建和修改数据库时可以指定字符集和比较规则:
CREATE DATABASE 数据库名
[[DEFAULT] CHARACTER SET 字符集名称]
[[DEFAULT] COLLATE 比较规则名称];
ALTER DATABASE 数据库名
[[DEFAULT] CHARACTER SET 字符集名称]
[[DEFAULT] COLLATE 比较规则名称];
character_set_database 表示当前数据库的字符集, collation_database 表示当前默认数据库的比较规则,这两个系统变量是只读的,不能修改。如果没有指定当前默认数据库,则变量与相应的服务器级系统变量具有相同的值。

4.3 表级别

创建和修改表的时候指定表的字符集和比较规则:
CREATE TABLE 表名 (列的信息)
[[DEFAULT] CHARACTER SET 字符集名称]
[COLLATE 比较规则名称]];
ALTER TABLE 表名
[[DEFAULT] CHARACTER SET 字符集名称]
[COLLATE 比较规则名称];

4.4 列级别

创建和修改列定义的时候可以指定该列的字符集和比较规则:
CREATE TABLE 表名(
列名 字符串类型 [CHARACTER SET 字符集名称] [COLLATE 比较规则名称],
其他列...);
ALTER TABLE 表名 MODIFY 列名 字符串类型 [CHARACTER SET 字符集名称] [COLLATE 比较规则名称];

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值