Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


12.13 添加字符集

本节讨论了如何将字符集添加到 MySQL 中。正确的步骤取决于字符集是否为简单或复杂:

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

  • 如果字符集需要任何这些特性,那么它是复杂的。

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

要使用以下步骤,您需要拥有 MySQL 源代码分布。在步骤中,MYSET 表示您想添加的字符集名称。

  1. 添加一个<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号。从1024到2047之间的ID范围保留给用户定义的排序规则。要找到当前使用的最大排序规则ID,可以使用以下查询:

    SELECT MAX(ID) FROM INFORMATION_SCHEMA.COLLATIONS;
  2. 这步骤取决于您是否添加了简单或复杂字符集。一个简单字符集只需要配置文件,而一个复杂字符集需要定义排序函数、多字节函数或两者C源文件。

    对于简单字符集,创建一个描述字符集属性的配置文件MYSET.xml。将该文件创建在sql/share/charsets目录中。你可以使用latin1.xml的副本作为该文件的基础。该文件的语法非常简单:

    • 注释写成普通XML注释(<!-- text -->)。

    • <map> 数组元素中的单词由任意数量的空格分隔。

    • 每个 <map> 数组元素中的单词都必须是十六进制数字格式。

    • <map> 数组元素的 <ctype> 元素有 257 个单词,其他 <map> 数组元素都有 256 个单词。详见Section 12.13.1, “Character Definition Arrays”

    • Index.xml 文件中的每个字符集对应的 <charset> 元素,MYSET.xml 文件都必须包含一个定义字符顺序的 <collation> 元素。

    对于复杂的字符集,创建一个 C 源文件,该文件描述字符集属性并定义必要的支持函数,以便正确地对字符集进行操作:

  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.cstrings/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. 重新配置、重新编译并测试。