本节讨论将字符集添加到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号。ID的范围从1024到2047保留给用户定义的归类。要查找当前使用的最大归类ID的最大值,请使用以下查询:
SELECT MAX(ID) FROM INFORMATION_SCHEMA.COLLATIONS;
此步骤取决于您要添加简单字符集还是复杂字符集。一个简单的字符集仅需要一个配置文件,而一个复杂的字符集则需要C源文件,该文件定义了归类功能和/或多字节功能。
对于简单的字符集,创建一个
MYSET.xml
描述字符集属性的配置文件。在sql/share/charsets
目录中创建此文件。您可以使用的副本latin1.xml
作为此文件的基础。该文件的语法非常简单:- 注释被编写为普通的XML注释()。
<!--text-->
<map>
数组元素中的单词由任意数量的空格分隔。<map>
数组元素中的每个单词都必须是十六进制格式的数字。<map>
元素的数组元素<ctype>
有257个字。之后的其他<map>
数组元素具有256个字。请参见“字符定义数组”。- 对于中的
<charset>
字符集元素中列出的每个排序规则Index.xml
,MYSET.xml
必须包含一个<collation>
定义字符顺序的元素。
对于复杂的字符集,创建一个C源文件,该文件描述字符集属性并定义对字符集正确执行操作所必需的支持例程:
- 在目录中创建文件。查看现有文件之一(例如),以了解需要定义的内容。在文件中的数组必须有一样的名字,等。这些对应于简单字符集的数组。请参见“字符定义数组”。
ctype-MYSET.c
strings
ctype-*.c
ctype-big5.c
ctype_MYSET
to_lower_MYSET
- 对于
<collation>
中的<charset>
字符集元素中列出的每个元素Index.xml
,文件必须提供排序规则的实现。ctype-MYSET.c
- 如果字符集需要字符串整理功能,请参见“对复杂字符集的字符串整理支持”。
- 如果字符集需要多字节字符支持,请参见“复杂字符集的多字节字符支持”。
- 注释被编写为普通的XML注释()。
修改配置信息。使用现有的配置信息作为为添加信息的指南
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
将这些行添加到“ registration ”部分:
#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
:MYSET
以CHARSETS_AVAILABLE
字母顺序添加到with的值。- 按字母顺序添加
MYSET
到的值CHARSETS_COMPLEX
。即使是简单的字符集,也需要这样做,否则CMake将无法识别。-DDEFAULT_CHARSET=MYSET
- 重新配置,重新编译和测试。