10.13.1 字符定义数组

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

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

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

  • <unicode> maps 8-bit 字符值为 Unicode 值。

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

对于在strings目录的ctype-MYSET.c文件中实现的复杂字符集,有相应的数组:ctype_MYSET[]to_lower_MYSET[]等。并非每个复杂的字符集都包含所有数组。有关示例,另请参见现有的ctype-*.c files。有关其他信息,请参阅strings目录中的CHARSET_INFO.txt文件。

大多数数组都由字符 value 索引,并且有 256 个元素。 <ctype> array 由字符 value 1 索引,有 257 个元素。这是处理EOF的 legacy 约定。

<ctype> array 元素是位值。每个元素描述字符集中单个字符的属性。每个属性都与位掩码相关联,如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> value 应该是描述该字符的适用位掩码值的 union。对于 example,'A'是一个大写字符(_MY_U)以及一个十六进制数字(_MY_X),因此它的ctype value 应该像这样定义:

ctype['A'+1] = _MY_U | _MY_X = 01 | 0200 = 0201

m_ctype.h中的位掩码值是八进制值,但MYSET.xml<ctype> array 的元素应写为十六进制值。

<lower><upper>数组包含与字符集的每个成员对应的小写和大写字符。例如:

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

每个<collation> array 指示如何排序字符以进行比较和排序。 MySQL 根据此信息的值对字符进行排序。在某些情况下,这与<upper> array 相同,这意味着排序是 case-insensitive。有关更复杂的排序规则(对于复杂的字符_set),请参阅第 10.13.2 节,“String 整理支持复杂字符 Sets”中 string 整理的讨论。

Updated at: 9 months ago
添加字符集Table of contentString 整理支持复杂字符 Sets