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 节“对复杂字符集的字符串整理支持”中有关字符串排序的讨论。