10.13.1 字符定义数组
每个简单字符集都有一个位于sql/share/charsets
目录中的配置文件。对于名为* MYSYS
*的字符集,文件名为MYSET.xml
。它使用<map>
数组元素列出字符集属性。 <map>
元素出现在以下元素中:
-
<ctype>
定义每个字符的属性。 -
<lower>
和<upper>
列出了小写和大写字符。 -
<unicode>
将 8 位字符值 Map 到 Unicode 值。 -
<collation>
元素 table 示用于比较和排序的字符 Sequences,每个排序规则一个元素。二进制排序规则不需要<map>
元素,因为字符代码本身提供了排序。
对于在strings
目录中的ctype-MYSET.c
文件中实现的复杂字符集,有相应的数组:ctype_MYSET[]
,to_lower_MYSET[]
等。并非每个复杂的字符集都具有所有数组。有关示例,另请参见现有的ctype-*.c
文件。有关其他信息,请参见strings
目录中的CHARSET_INFO.txt
文件。
大多数数组都由字符值索引,并具有 256 个元素。 <ctype>
数组由字符值 1 索引,并具有 257 个元素。这是处理EOF
的传统约定。
<ctype>
数组元素是位值。每个元素描述字符集中单个字符的属性。每个属性都与include/m_ctype.h
中定义的位掩码相关联:
#define _MY_U 01 /* Upper case */
#define _MY_L 02 /* Lower case */
#define _MY_NMR 04 /* Numeral (digit) */
#define _MY_SPC 010 /* Spacing character */
#define _MY_PNT 020 /* Punctuation */
#define _MY_CTR 040 /* Control character */
#define _MY_B 0100 /* Blank */
#define _MY_X 0200 /* heXadecimal digit */
给定字符的<ctype>
值应为描述该字符的适用位掩码值的并集。例如,'A'
是大写字符(_MY_U
)和十六进制数字(_MY_X
),因此应将其ctype
值定义如下:
ctype['A'+1] = _MY_U | _MY_X = 01 | 0200 = 0201
m_ctype.h
中的位掩码值是八进制值,但是MYSET.xml
中的<ctype>
数组的元素应写为十六进制值。
<lower>
和<upper>
数组包含对应于字符集每个成员的小写和大写字符。例如:
lower['A'] should contain 'a'
upper['a'] should contain 'A'
每个<collation>
数组都指示应如何排序字符以进行比较和排序。 MySQL 根据此信息的值对字符进行排序。在某些情况下,它与<upper>
数组相同,这意味着排序不区分大小写。有关更复杂的排序规则(对于复杂的字符集),请参见第 10.13.2 节“对复杂字符集的字符串整理支持”中有关字符串排序的讨论。