文档首页
MySQL 9.0 参考手册
相关文档 下载此手册
PDF(US Ltr) - 40.0Mb
PDF(A4) - 40.1Mb
手册页(TGZ) - 258.2Kb
手册页(Zip) - 365.3Kb
Info(Gzip) - 4.0Mb
Info(Zip) - 4.0Mb


12.13 添加字符集

本节介绍向 MySQL 添加字符集的步骤。正确步骤取决于字符集是简单字符集还是复杂字符集。

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

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

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

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

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

    对于简单字符集,请创建一个配置文件 MYSET.xml,它描述了字符集属性。在 sql/share/charsets 目录中创建此文件。您可以使用 latin1.xml 的副本作为此文件的依据。该文件语法非常简单

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

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

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

    • <ctype> 元素的 <map> 数组元素有 257 个词语。之后的其他 <map> 数组元素有 256 个词语。请参见 第 12.13.1 节,“字符定义数组”

    • 对于 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.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. 重新配置、重新编译和测试。