10bet网址
MySQL 5.7参考手册
相关的文档10bet官方网站 下载本手册
PDF(美国高级主任)- 36.3 mb
PDF (A4)- 36.3 mb
手册页(TGZ)- 236.9 kb
手册页(Zip)- 348.5 kb
信息(Gzip)- 3.3 mb
信息(邮政编码)- 3.3 mb
本手册节选

10.14.1排序规则实现类型

MySQL实现了几种类型的排序规则:

简单的8位字符集排序

这种排序是使用一个256个权重的数组实现的,该数组定义了从字符代码到权重的一对一映射。latin1_swedish_ci是一个例子。它是一种不区分大小写的排序规则,因此一个字符的大写和小写版本具有相同的权重,并且它们比较时相等。

mysql> SET NAMES 'latin1' COLLATE 'latin1_swedish_ci';mysql> SELECT HEX(WEIGHT_STRING('a')), HEX(WEIGHT_STRING('a'));+-------------------------+-------------------------+ | 十六进制(WEIGHT_STRING (' a ')) |十六进制(WEIGHT_STRING(“ ')) | +-------------------------+-------------------------+ | 41 | 41  | +-------------------------+-------------------------+ 1行组(0.01秒)mysql >选择' a ' = ' a ';+-----------+ | ' “=” ' | +-----------+ | 1  | +-----------+ 1行集(0.12秒)

有关实现说明,请参见第10.14.3节“向8位字符集添加简单排序规则”

8位字符集的复杂排序规则

这种排序是使用C源文件中的函数实现的,这些函数定义了如何对字符排序,如中所述章节10.13,“添加字符集”

非unicode多字节字符集的排序规则

对于这种类型的排序,8位(单字节)字符和多字节字符的处理方式不同。对于8位字符,字符代码以不区分大小写的方式映射到权重。(例如,单字节字符“一个”而且“一个”两者的权重都是0 x41)。对于多字节字符,字符代码和权重之间有两种类型的关系:

  • 权重等于字符代码。sjis_japanese_ci就是这种排序的一个例子。多字节字符“ぢ”有一个字符代码0 x82c0,重量也是0 x82c0

    mysql> CREATE TABLE t1 (c1 VARCHAR(2) CHARACTER SET sjis COLLATE sjis_japanese_ci);mysql> INSERT INTO t1 VALUES ('a'),(' a'),(0x82C0);查询OK, 3行影响(0.00 sec)记录:3重复:0警告:0 mysql> SELECT c1,十六进制(c1),十六进制(WEIGHT_STRING(c1)) FROM t1;+------+---------+------------------------+ | c1 |十六进制(c1) |十六进制(WEIGHT_STRING (c1 )) | +------+---------+------------------------+ | 41 | 61 | | | | 41 | 41 | |ぢc0 | 82 | 82 c0  | +------+---------+------------------------+ 3行集(0.00秒)
  • 字符代码一对一地映射到权重,但代码不一定等于权重。gbk_chinese_ci就是这种排序的一个例子。多字节字符'膰'有一个字符代码0 x81b0但是有很多0 xc286

    mysql> CREATE TABLE t1 (c1 VARCHAR(2) CHARACTER SET gbk COLLATE gbk_chinese_ci);mysql> INSERT INTO t1 VALUES ('a'),(' a'),(0x81B0);查询OK, 3行影响(0.00 sec)记录:3重复:0警告:0 mysql> SELECT c1,十六进制(c1),十六进制(WEIGHT_STRING(c1)) FROM t1;+------+---------+------------------------+ | c1 |十六进制(c1) |十六进制(WEIGHT_STRING (c1 )) | +------+---------+------------------------+ | 41 | 61 | | | | 41 | 41 | |膰b0 | 81 | C286  | +------+---------+------------------------+ 3行集(0.00秒)

有关实现说明,请参见章节10.13,“添加字符集”

Unicode多字节字符集的排序规则

其中一些排序规则基于Unicode排序规则算法(UCA),另一些则不是。

非uca排序规则具有从字符代码到权重的一对一映射。在MySQL中,这样的排序不区分大小写和重音。utf8_general_ci是一个例子:“一个”“一个”“一个”,“一个”每个都有不同的字符代码,但都有一个权重0 x0041相等比较。

mysql> SET NAMES 'utf8' COLLATE 'utf8_general_ci';查询OK, 0 rows affected (0.00 sec) mysql> CREATE TABLE t1 (c1 CHAR(1) CHARACTER SET UTF8 COLLATE utf8_general_ci);mysql> INSERT INTO t1 VALUES ('a'),(' a'),(' À'),('á');查询OK, 4行影响(0.00 sec)记录:4重复:0警告:0 mysql> SELECT c1,十六进制(c1),十六进制(WEIGHT_STRING(c1)) FROM t1;+------+---------+------------------------+ | c1 |十六进制(c1) |十六进制(WEIGHT_STRING (c1 )) | +------+---------+------------------------+ | | 61 | 0041 | | 0041 | | 41 | |的| C380 | 0041 | |是| C3A1 | 0041年  | +------+---------+------------------------+ 4行集(0.00秒)

在MySQL中,基于uca的排序有以下属性:

  • 如果一个字符有权重,每个权重使用2个字节(16位)。

  • 字符可以有零权重(或者空权重)。在这种情况下,字符是可以忽略的。例如:“U+0000 NULL”没有权重,是可以忽略的。

  • 一个字符可以有一个权重。例子:“一个”其重量为0 x0e33

    mysql> SET NAMES 'utf8' COLLATE 'utf8_unicode_ci';mysql> SELECT HEX('a'), HEX(WEIGHT_STRING('a'));+----------+-------------------------+ | 十六进制(a) |十六进制(WEIGHT_STRING (' ')) | +----------+-------------------------+ | 61 | 0 e33  | +----------+-------------------------+ 1行集(0.02秒)
  • 一个字符可以有很多权重。这是展开式。例子:德语字母“ß”(SZ结扎,或SHARP S)的重量为0 x0fea0fea

    mysql> SET NAMES 'utf8' COLLATE 'utf8_unicode_ci';mysql> SELECT HEX('ß'), HEX(WEIGHT_STRING('ß'));+-----------+--------------------------+ | 十六进制(ß)|十六进制(WEIGHT_STRING(ß ')) | +-----------+--------------------------+ | C39F | 0 fea0fea  | +-----------+--------------------------+ 1行集(0.00秒)
  • 许多字符可能有一个权重。这是缩略语。例子:“ch”在捷克语中是一个字母,其重量为0 x0ee2

    mysql> SET NAMES 'utf8' COLLATE 'utf8_czech_ci';mysql> SELECT HEX('ch'), HEX(WEIGHT_STRING('ch'));+-----------+--------------------------+ | 十六进制(ch) |十六进制(WEIGHT_STRING (ch ')) | +-----------+--------------------------+ | 6368 | 0 ee2  | +-----------+--------------------------+ 1行集(0.00秒)

多字符到多权重的映射也是可能的(这是收缩与展开),但MySQL不支持。

有关非uca排序规则的实现说明,请参见章节10.13,“添加字符集”.有关UCA排序,请参见第10.14.4节,“向Unicode字符集添加UCA排序规则”

各种各样的针对性

还有一些排序规则不属于前面的任何类别。