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_
、MYSET
to_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
-
-
-
重新配置、重新编译并测试。