10.13 添加字符集
本节讨论将字符集添加到 MySQL 的过程。正确的过程取决于字符集是简单还是复杂:
-
如果字符集不需要特殊的字符串整理例程进行排序,并且不需要多字节字符支持,则它很简单。
-
如果字符集需要这些功能之一,则很复杂。
例如,greek
和swe7
是简单字符集,而big5
和czech
是复杂字符集。
要使用以下说明,您必须具有 MySQL 源发行版。在说明中,* MYSET
*table 示要添加的字符集的名称。
- 将_
MYSET
*的<charset>
元素添加到sql/share/charsets/Index.xml
文件中。使用文件中的现有内容作为添加新内容的指南。latin1
<charset>
元素的部分 Lists 如下:
<charset name="latin1">
<family>Western</family>
<description>cp1252 West European</description>
...
<collation name="latin1_swedish_ci" id="8" order="Finnish, Swedish">
<flag>primary</flag>
<flag>compiled</flag>
</collation>
<collation name="latin1_danish_ci" id="15" order="Danish"/>
...
<collation name="latin1_bin" id="47" order="Binary">
<flag>binary</flag>
<flag>compiled</flag>
</collation>
...
</charset>
<charset>
元素必须列出该字符集的所有归类。这些必须至少包括二进制排序规则和默认(主要)排序规则。默认排序规则通常使用后缀general_ci
命名(一般,不区分大小写)。二进制排序规则有可能是默认排序规则,但通常它们是不同的。默认排序规则应带有primary
标志。二进制排序规则应具有binary
标志。
您必须为每个排序规则分配唯一的 ID 号。 ID 的范围从 1024 到 2047,保留给用户定义的归类。要查找当前使用的最大归类 ID 的最大值,请使用以下查询:
SELECT MAX(ID) FROM INFORMATION_SCHEMA.COLLATIONS;
- 此步骤取决于您要添加简单字符集还是复杂字符集。一个简单的字符集仅需要一个配置文件,而一个复杂的字符集则需要 C 源文件,该文件定义了归类功能,多字节功能或两者。
对于简单的字符集,创建一个描述字符集属性的配置文件MYSET.xml
。在sql/share/charsets
目录中创建此文件。您可以使用latin1.xml
的副本作为此文件的基础。该文件的语法非常简单:
-
Comments 以普通 XMLComments(
<!-- text -->
)的形式编写。 -
<map>
数组元素中的单词由任意数量的空格分隔。 -
<map>
数组元素中的每个单词都必须是十六进制格式的数字。 -
<ctype>
元素的<map>
数组元素有 257 个字。之后的其他<map>
数组元素具有 256 个字。参见第 10.13.1 节“字符定义数组”。 -
对于
Index.xml
中的字符集,在<charset>
元素中列出的每个归类,MYSET.xml
必须包含定义字符 Sequences 的<collation>
元素。
对于复杂的字符集,创建一个 C 源文件,该文件描述字符集属性并定义正确执行该字符集所需的支持例程:
-
在
strings
目录中创建文件ctype-MYSET.c
。查看现有的ctype-*.c
文件(例如ctype-big5.c
)之一,以查看需要定义的内容。文件中的数组必须具有ctype_MYSET
,to_lower_MYSET
等名称。这些对应于简单字符集的数组。参见第 10.13.1 节“字符定义数组”。 -
对于
Index.xml
中字符集的<charset>
元素中列出的每个<collation>
元素,ctype-MYSET.c
文件必须提供排序规则的实现。 -
如果字符集需要字符串整理功能,请参见第 10.13.2 节“对复杂字符集的字符串整理支持”。
-
如果字符集需要多字节字符支持,请参见第 10.13.3 节“复杂字符集的多字节字符支持”。
-
修改配置信息。使用现有的配置信息作为添加*
MYSYS
信息的指南。此处的示例假定字符集具有默认排序规则和二进制排序规则,但是如果MYSET
*具有其他排序规则,则需要更多行。 -
编辑
mysys/charset-def.c
,并“注册”新字符集的归类。
将这些行添加到“声明”部分:
#ifdef HAVE_CHARSET_MYSET
extern CHARSET_INFO my_charset_MYSET_general_ci;
extern CHARSET_INFO my_charset_MYSET_bin;
#endif
将这些行添加到“注册”部分:
#ifdef HAVE_CHARSET_MYSET
add_compiled_collation(&my_charset_MYSET_general_ci);
add_compiled_collation(&my_charset_MYSET_bin);
#endif
-
如果字符集使用
ctype-MYSET.c
,则编辑strings/CMakeLists.txt
并将ctype-MYSET.c
添加到STRINGS_SOURCES
变量的定义中。 -
编辑
cmake/character_sets.cmake
: -
按字母 Sequences 将*
MYSET
*添加到 withCHARSETS_AVAILABLE
的值中。- 将*
MYSET
*按字母 Sequences 添加到CHARSETS_COMPLEX
的值中。即使是简单的字符集,也需要这样做,否则 CMake 将无法识别-DDEFAULT_CHARSET=MYSET。
- 将*
-
重新配置,重新编译和测试。