本节介绍向 MySQL 添加字符集的步骤。正确步骤取决于字符集是简单字符集还是复杂字符集。
如果字符集不需要特殊的字符串排序例程进行排序,也不需要多字节字符支持,则该字符集是简单的。
如果字符集需要上述任一功能,则该字符集是复杂的。
例如,greek
和 swe7
是简单字符集,而 big5
和 czech
是复杂字符集。
要使用以下说明,您必须拥有 MySQL 源代码发行版。在说明中,MYSET
表示您要添加的字符集的名称。
在
sql/share/charsets/Index.xml
文件中为MYSET
添加一个<charset>
元素。使用文件中现有的内容作为添加新内容的参考。以下是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>
数组元素中的每个词语必须是十六进制格式的数字。<ctype>
元素的<map>
数组元素有 257 个词语。之后的其他<map>
数组元素有 256 个词语。请参见 第 12.13.1 节,“字符定义数组”。对于
Index.xml
中字符集的<charset>
元素中列出的每个排序规则,
必须包含一个MYSET
.xml<collation>
元素,它定义了字符排序。
对于复杂字符集,请创建一个 C 源文件,它描述了字符集属性,并定义了正确执行字符集操作所需的支持例程
在
strings
目录中创建文件ctype-
。查看现有的MYSET
.cctype-*.c
文件之一(例如ctype-big5.c
)以了解需要定义的内容。文件中的数组必须具有ctype_
、MYSET
to_lower_
等名称。这些名称对应于简单字符集的数组。请参见 第 12.13.1 节,“字符定义数组”。MYSET
对于
Index.xml
中字符集的<charset>
元素中列出的每个<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
重新配置、重新编译和测试。