本节讨论将字符集添加到 MySQL 的过程。正确的过程取决于字符集是简单还是复杂:
-
如果字符集不需要特殊的字符串排序例程进行排序,也不需要多字节字符支持,那么它是简单的。
-
如果字符集需要上述任一功能,则它是复杂的。
例如,greek
和 swe7
是简单的字符集,而 big5
和 czech
是复杂的字符集。
要使用以下说明,您必须具有 MySQL 源代码发行版。在说明中,MYSET
表示要添加的字符集的名称。
-
将
MYSET
的<charset>
元素添加到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 号。ID 范围从 1024 到 2047 保留给用户定义的排序规则。要查找当前使用的排序规则 ID 的最大值,请使用以下查询:
SELECT MAX(ID) FROM INFORMATION_SCHEMA.COLLATIONS;
-
此步骤取决于您是添加简单字符集还是复杂字符集。简单字符集只需要一个配置文件,而复杂字符集需要定义排序规则函数、多字节函数或两者的 C 源文件。
对于简单字符集,创建一个配置文件,
,描述字符集属性。在MYSET
.xmlsql/share/charsets
目录中创建此文件。您可以使用latin1.xml
的副本作为此文件的基础。文件的语法非常简单:-
注释写成普通的 XML 注释(
<!--
)。text
--> -
<map> 数组元素中的单词之间用任意数量的空格分隔。
-
<map> 数组元素中的每个单词都必须是十六进制格式的数字。
-
<ctype> 元素的 <map> 数组元素有 257 个单词。之后的其他 <map> 数组元素有 256 个单词。请参阅 章节 12.13.1,“字符定义数组”。
-
对于 Index.xml 中字符集的 <charset> 元素中列出的每个排序规则,<em class="replaceable">
MYSET
.xml 必须包含一个定义字符顺序的 <collation> 元素。
对于复杂字符集,创建一个 C 源文件,描述字符集属性并定义正确执行字符集操作所需的支持例程:
-
在 strings 目录中创建 ctype-<em class="replaceable">
MYSET
.c 文件。查看现有的 ctype-*.c 文件之一(例如 ctype-big5.c),了解需要定义的内容。文件中的数组必须具有 ctype_<em class="replaceable">MYSET
、to_lower_<em class="replaceable">MYSET
等名称。这些对应于简单字符集的数组。请参阅 章节 12.13.1,“字符定义数组”。 -
对于 Index.xml 中字符集的 <charset> 元素中列出的每个 <collation> 元素,ctype-<em class="replaceable">
MYSET
.c 文件必须提供排序规则的实现。 -
如果字符集需要字符串排序函数,请参阅 章节 12.13.2,“复杂字符集的字符串排序支持”。
-
如果字符集需要多字节字符支持,请参阅 章节 12.13.3,“复杂字符集的多字节字符支持”。
-
-
修改配置信息。使用现有的配置信息作为添加 <em class="replaceable">
MYSYS
信息的指南。此处的示例假设字符集具有默认和二进制排序规则,但如果 <em class="replaceable">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
-
-
-
重新配置、重新编译和测试。