每个简单字符集都有一个配置文件,位于 sql/share/charsets 目录中。对于一个名为 MYSYS 的字符集,文件名为 。它使用 MYSET.xml<map> 数组元素来列出字符集属性。<map> 元素出现在以下元素中:
-
<ctype>定义每个字符的属性。 -
<lower>和<upper>列出小写和大写字符。 -
<unicode>将 8 位字符值映射到 Unicode 值。 -
<collation>元素指示字符排序顺序,一个元素对应一个排序顺序。二进制排序不需要<map>元素,因为字符代码本身提供了排序顺序。
对于在 strings 目录中的 ctype- 文件中实现的复杂字符集,有相应的数组:MYSET.cctype_、MYSET[]to_lower_ 等。不是每个复杂字符集都有所有的数组。请参阅现有的 MYSET[]ctype-*.c 文件的示例。请参阅 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> 数组元素应该写为十六进制值。
The <lower> 和 <upper> 数组持有字符集中的小写和大写字符。例如:
lower['A'] should contain 'a'
upper['a'] should contain 'A'
每个 <collation> 数组指示字符应该如何排序以进行比较和排序目的。 MySQL 根据这些信息的值对字符进行排序。在某些情况下,这与 <upper> 数组相同,这意味着排序是大小写不敏感的。对于更复杂的排序规则(对于复杂字符集),请参阅 第 12.13.2 节,“字符串排序支持复杂字符集” 中的讨论。