Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


12.13.1 字符定义数组

每个简单字符集都有一个配置文件,位于sql/share/charsets目录中。对于名为 MYSYS 的字符集,该文件名为 MYSET.xml。它使用<map>数组元素来列出字符集属性。<map> 元素出现在这些元素中:

  • <ctype> 定义每个字符的属性。

  • <lower><upper> 列出小写和大写字符。

  • <unicode> 将 8 位字符值映射到 Unicode 值。

  • <collation> 元素指示比较和排序的字符顺序,一个元素对应一个排序规则。二进制排序不需要<map> 元素,因为字符代码本身提供了顺序。

对于复杂字符集,如在 strings 目录中的 ctype-MYSET.c 文件中实现的那样,有相应的数组:ctype_MYSET[]to_lower_MYSET[] 等等。不是每个复杂字符集都有所有数组。请参见现有的 ctype-*.c 文件的示例。请参见 CHARSET_INFO.txt 文件在 strings 目录中获取更多信息。

大多数数组是以字符值索引的,共有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 中是八进制值,但 <ctype> 数组元素在 MYSET.xml 中应该写成十六进制值。

<lower><upper> 数组分别存储字符集中的小写字母和大写字母对应的每个成员。例如:

lower['A'] should contain 'a'
upper['a'] should contain 'A'

每个<collation>数组都表示字符在比较和排序时的顺序。MySQL 根据这个信息对字符进行排序。在某些情况下,这与<upper>数组相同,意味着排序不区分大小写。对于复杂字符集的排序规则(见第12.13.2节,“Complex Character Sets 字符串排序支持”)。