本节介绍二进制字符串的排序规则与非binary
二进制字符串的排序规则的比较_bin
。
二进制字符串(使用 、 和 数据类型存储
BINARY
)
VARBINARY
有
BLOB
一个名为binary
. 二进制字符串是字节序列,这些字节的数值决定比较和排序顺序。请参阅
第 10.10.8 节,“二进制字符集”。
非二进制字符串(使用 、 和 数据类型存储
CHAR
)
VARCHAR
的
TEXT
字符集和排序规则不是binary
. 一个给定的非二进制字符集可以有多个排序规则,每个排序规则为该集中的字符定义一个特定的比较和排序顺序。对于大多数字符集,其中之一是二进制排序规则,由_bin
排序规则名称中的后缀表示。例如, 和 的二进制排序规则分别
命名为latin1
和。
是一个具有两个二进制排序规则的异常,并且
; 看
big5
latin1_bin
big5_bin
utf8mb4
utf8mb4_bin
utf8mb4_0900_bin
第 10.10.1 节,“Unicode 字符集”。
binary
排序规则在几个方面不同于
排序规则,
将_bin
在以下部分中讨论:
二进制字符串是字节序列。对于
binary
排序规则,比较和排序基于数字字节值。非二进制字符串是字符序列,可能是多字节的。非二进制字符串的排序规则定义用于比较和排序的字符值的顺序。对于_bin
排序规则,此排序基于数字字符代码值,这类似于二进制字符串的排序,只是字符代码值可能是多字节。
非二进制字符串具有一个字符集,并且在许多情况下会自动转换为另一个字符集,即使该字符串具有_bin
排序规则:
将列值分配给具有不同字符集的另一列时:
UPDATE t1 SET utf8mb4_bin_column=latin1_column; INSERT INTO t1 (latin1_column) SELECT utf8mb4_bin_column FROM t2;
INSERT
为或UPDATE
使用字符串文字 分配列值时 :SET NAMES latin1; INSERT INTO t1 (utf8mb4_bin_column) VALUES ('string-in-latin1');
将结果从服务器发送到客户端时:
SET NAMES latin1; SELECT utf8mb4_bin_column FROM t2;
对于二进制字符串列,不会发生转换。对于与前面类似的情况,字符串值是按字节复制的。
非二进制字符集的归类提供有关字符字母大小写的信息,因此非二进制字符串中的字符可以从一种字母转换为另一种,即使对于_bin
忽略字母大小写排序的归类也是如此:
mysql> SET NAMES utf8mb4 COLLATE utf8mb4_bin;
mysql> SELECT LOWER('aA'), UPPER('zZ');
+-------------+-------------+
| LOWER('aA') | UPPER('zZ') |
+-------------+-------------+
| aa | ZZ |
+-------------+-------------+
字母大小写的概念不适用于二进制字符串中的字节。要执行字母大小写转换,必须首先使用适合字符串中存储的数据的字符集将字符串转换为非二进制字符串:
mysql> SET NAMES binary;
mysql> SELECT LOWER('aA'), LOWER(CONVERT('aA' USING utf8mb4));
+-------------+------------------------------------+
| LOWER('aA') | LOWER(CONVERT('aA' USING utf8mb4)) |
+-------------+------------------------------------+
| aA | aa |
+-------------+------------------------------------+
MySQL 排序规则有一个 pad 属性,它的值为
PAD SPACE
or NO PAD
:
大多数 MySQL 排序规则都有一个 pad 属性
PAD SPACE
。基于 UCA 9.0.0 及更高版本的 Unicode 归类具有 pad 属性
NO PAD
;参见 第 10.10.1 节,“Unicode 字符集”。
对于非二进制字符串(CHAR
、
VARCHAR
和TEXT
值),字符串归类垫属性决定了比较字符串末尾尾随空格时的处理方式:
对于
PAD SPACE
排序规则,尾随空格在比较中是微不足道的;比较字符串时不考虑尾随空格。NO PAD
排序规则将尾随空格视为比较中的重要字符,就像任何其他字符一样。
可以使用两个
utf8mb4
二进制排序规则来演示不同的行为,其中一个是
PAD SPACE
,另一个是
NO PAD
。该示例还展示了如何使用该INFORMATION_SCHEMA
COLLATIONS
表来确定排序规则的 pad 属性。
mysql> SELECT COLLATION_NAME, PAD_ATTRIBUTE
FROM INFORMATION_SCHEMA.COLLATIONS
WHERE COLLATION_NAME LIKE 'utf8mb4%bin';
+------------------+---------------+
| COLLATION_NAME | PAD_ATTRIBUTE |
+------------------+---------------+
| utf8mb4_bin | PAD SPACE |
| utf8mb4_0900_bin | NO PAD |
+------------------+---------------+
mysql> SET NAMES utf8mb4 COLLATE utf8mb4_bin;
mysql> SELECT 'a ' = 'a';
+------------+
| 'a ' = 'a' |
+------------+
| 1 |
+------------+
mysql> SET NAMES utf8mb4 COLLATE utf8mb4_0900_bin;
mysql> SELECT 'a ' = 'a';
+------------+
| 'a ' = 'a' |
+------------+
| 0 |
+------------+
在此上下文中的“比较”不包括LIKE
模式匹配运算符,无论排序规则如何,尾随空格都很重要。
对于二进制字符串(BINARY
、
VARBINARY
和BLOB
值),所有字节在比较中都很重要,包括尾随空格:
mysql> SET NAMES binary;
mysql> SELECT 'a ' = 'a';
+------------+
| 'a ' = 'a' |
+------------+
| 0 |
+------------+
CHAR(
列存储非二进制字符串N
)N
字符长。对于插入,短于
N
字符的值用空格扩展。对于检索,删除尾随空格。
BINARY(
列存储二进制字符串N
)N
字节长。对于插入,短于
N
字节的值用字节扩展
0x00
。对于检索,不会删除任何内容;始终返回声明长度的值。
mysql> CREATE TABLE t1 (
a CHAR(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin,
b BINARY(10)
);
mysql> INSERT INTO t1 VALUES ('x','x');
mysql> INSERT INTO t1 VALUES ('x ','x ');
mysql> SELECT a, b, HEX(a), HEX(b) FROM t1;
+------+------------------------+--------+----------------------+
| a | b | HEX(a) | HEX(b) |
+------+------------------------+--------+----------------------+
| x | 0x78000000000000000000 | 78 | 78000000000000000000 |
| x | 0x78200000000000000000 | 78 | 78200000000000000000 |
+------+------------------------+--------+----------------------+