12.13 添加字符集
本节讨论了如何将字符集添加到 MySQL 中。正确的步骤取决于字符集是否为简单或复杂:
-
如果字符集不需要特殊的字符串排序支持,也不需要多字节字符支持,那么它是简单的。
-
如果字符集需要任何这些特性,那么它是复杂的。
例如,greek 和 swe7 是简单的字符集,而 big5 和 czech 则是复杂的字符集。
要使用以下步骤,您需要拥有 MySQL 源代码分布。在步骤中,MYSET 表示您想添加的字符集名称。
-
添加一个
<charset>元素到MYSET中,文件路径为sql/share/charsets/Index.xml。使用该文件中的内容作为添加新内容的指南。以下是对latin1的<charset>元素的部分列表:<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号。从1024到2047之间的ID范围保留给用户定义的排序规则。要找到当前使用的最大排序规则ID,可以使用以下查询:
SELECT MAX(ID) FROM INFORMATION_SCHEMA.COLLATIONS; -
这步骤取决于您是否添加了简单或复杂字符集。一个简单字符集只需要配置文件,而一个复杂字符集需要定义排序函数、多字节函数或两者C源文件。
对于简单字符集,创建一个描述字符集属性的配置文件
。将该文件创建在MYSET.xmlsql/share/charsets目录中。你可以使用latin1.xml的副本作为该文件的基础。该文件的语法非常简单:-
注释写成普通XML注释(
<!--)。text--> -
<map>数组元素中的单词由任意数量的空格分隔。 -
每个
<map>数组元素中的单词都必须是十六进制数字格式。 -
<map>数组元素的<ctype>元素有 257 个单词,其他<map>数组元素都有 256 个单词。详见Section 12.13.1, “Character Definition Arrays”。 -
在
Index.xml文件中的每个字符集对应的<charset>元素,文件都必须包含一个定义字符顺序的MYSET.xml<collation>元素。
对于复杂的字符集,创建一个 C 源文件,该文件描述字符集属性并定义必要的支持函数,以便正确地对字符集进行操作:
-
在
strings目录中创建名为ctype-的文件。查看现有的MYSET.cctype-*.c文件(例如ctype-big5.c)以了解需要定义的内容。您的文件中的数组名称必须像ctype_、MYSETto_lower_等,这些对应于简单字符集的数组。详见Section 12.13.1, “Character Definition Arrays”。MYSET -
对于在
Index.xml中的每个<collation>元素,字符集在ctype-文件中必须提供实现。MYSET.c -
如果字符集需要字符串排序函数,请参阅第 12.13.2 节,“复杂字符集的字符串排序支持”。
-
如果字符集需要多字节字符支持,请参阅第 12.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.cstrings/CMakeLists.txt,并将ctype-添加到MYSET.cSTRINGS_SOURCES变量的定义中。 -
编辑cmake/character_sets.cmake:-
将MYSET添加到以字母顺序排列的CHARSETS_AVAILABLE值中。 -
将MYSET添加到以字母顺序排列的CHARSETS_COMPLEX值中。即使是简单的字符集,也需要这样,以便CMake可以识别-DDEFAULT_CHARSET=。MYSET
-
-
-
重新配置、重新编译并测试。