## 10.13 添加字符集

[10.13.1 字符定义数组](character-arrays.html)
[10.13.2 复杂字符集的字符串整理支持](string-collating.html)
[10.13.3 复杂字符集的多字节字符支持](multibyte-characters.html)

[](<>)[](<>)

本节讨论将字符集添加到 MySQL 的过程。正确的过程取决于字符集是简单还是复杂：

-   如果字符集不需要特殊的字符串整理例程进行排序，也不需要多字节字符支持，那很简单。

-   如果字符集需要这些功能中的任何一个，那就很复杂了。

    例如，`希腊语`和`swe7`是简单的字符集，而`大五`和`捷克语`是复杂的字符集。

    要使用以下说明，您必须具有 MySQL 源代码分发。在说明中，*`MYSET`*表示要添加的字符集的名称。

1.  添加一个`<字符集>`元素*`MYSET`*到`sql/share/charsets/Index.xml`文件。使用文件中的现有内容作为添加新内容的指南。的部分清单`拉丁语1` `<字符集>`元素如下：

    ```
    <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>
    ```

    这`<字符集>`element 必须列出字符集的所有排序规则。这些必须至少包括一个二进制排序规则和一个默认（主）排序规则。默认排序规则通常使用后缀命名`general_ci`（一般，不区分大小写）。二进制排序规则可能是默认排序规则，但通常它们是不同的。默认排序规则应该有一个`基本的`旗帜。二进制排序规则应该有一个`二进制`旗帜。

    您必须为每个排序规则分配一个唯一的 ID 号。从 1024 到 2047 的 ID 范围是为用户定义的排序规则保留的。要查找当前使用的排序规则 ID 的最大值，请使用以下查询：

    ```
    SELECT MAX(ID) FROM INFORMATION_SCHEMA.COLLATIONS;
    ```

2.  此步骤取决于您添加的是简单字符集还是复杂字符集。一个简单的字符集只需要一个配置文件，而一个复杂的字符集需要定义排序规则函数、多字节函数或两者的 C 源文件。

    对于一个简单的字符集，创建一个配置文件，`*`MYSET`*.xml`，它描述了字符集属性。在`sql/share/字符集`目录。您可以使用副本`latin1.xml`作为该文件的基础。该文件的语法非常简单：

    -   注释写成普通的 XML 注释 (`<!-- *`文本`* -->`）。

    -   里面的话`<地图>`数组元素由任意数量的空格分隔。

    -   里面的每一个字`<地图>`数组元素必须是十六进制格式的数字。

    -   这`<地图>`的数组元素`<ctype>`元素有 257 个单词。另一个`<地图>`之后的数组元素有 256 个字。看[第 10.13.1 节，“字符定义数组”](character-arrays.html).

    -   对于列表中列出的每个排序规则`<字符集>`字符集的元素`索引.xml`,`*`MYSET`*.xml`必须包含一个`<整理>`定义字符顺序的元素。

        对于复杂的字符集，创建一个描述字符集属性并定义正确执行字符集操作所需的支持例程的 C 源文件：

    -   创建文件`ctype-*`MYSET`*。C`在里面`字符串`目录。看看现有的一个`ctype-*.c`文件（例如`ctype-big5.c`) 查看需要定义的内容。文件中的数组必须具有类似的名称`ctype_*`MYSET`*`,`降低_*`MYSET`*`， 等等。这些对应于简单字符集的数组。看[第 10.13.1 节，“字符定义数组”](character-arrays.html).

    -   对于每个`<整理>`中列出的元素`<字符集>`字符集的元素`索引.xml`， 这`ctype-*`MYSET`*。C`文件必须提供排序规则的实现。

    -   如果字符集需要字符串整理功能，请参阅[第 10.13.2 节，“复杂字符集的字符串整理支持”](string-collating.html).

    -   如果字符集需要多字节字符支持，请参阅[第 10.13.3 节，“复杂字符集的多字节字符支持”](multibyte-characters.html).

3.  修改配置信息。使用现有配置信息作为添加信息的指南*`MYSYS`*.此处的示例假定字符集具有默认排序规则和二进制排序规则，但如果需要，则需要更多行*`MYSET`*有额外的排序规则。

    1.  编辑`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
        ```

    2.  如果字符集使用`ctype-*`MYSET`*。C`， 编辑`字符串/CMakeLists.txt`并添加`ctype-*`MYSET`*。C`的定义`STRINGS_SOURCES`多变的。

    3.  编辑`cmake/character_sets.cmake`：

        1.  添加*`MYSET`*与的值`CHARSETS_AVAILABLE`按字母顺序。

        2.  添加*`MYSET`*的价值`CHARSETS_COMPLEX`按字母顺序。即使是简单的字符集也需要这样做，因此**制作**能认出[`-DDEFAULT_CHARSET=*`MYSET`*`](source-configuration-options.html#option_cmake_default_charset).

4.  重新配置、重新编译和测试。
