Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

12.13 添加字符集

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

  • 如果字符集不需要特殊的字符串排序例程进行排序,也不需要多字节字符支持,那么它是简单的。

  • 如果字符集需要上述任一功能,则它是复杂的。

例如,greekswe7 是简单的字符集,而 big5czech 是复杂的字符集。

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

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

    对于简单字符集,创建一个配置文件,MYSET.xml,描述字符集属性。在 sql/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 源文件,描述字符集属性并定义正确执行字符集操作所需的支持例程:

  3. 修改配置信息。使用现有的配置信息作为添加 <em class="replaceable">MYSYS 信息的指南。此处的示例假设字符集具有默认和二进制排序规则,但如果 <em class="replaceable">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,请编辑 strings/CMakeLists.txt 并将 ctype-MYSET.c 添加到 STRINGS_SOURCES 变量的定义中。

    3. 编辑 cmake/character_sets.cmake

      1. 按字母顺序将 MYSET 添加到 CHARSETS_AVAILABLE 的值中。

      2. 按字母顺序将 MYSET 添加到 CHARSETS_COMPLEX 的值中。即使是简单的字符集也需要这样做,以便 CMake 可以识别 -DDEFAULT_CHARSET=MYSET

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