文档首页
MySQL 8.4 参考手册
相关文档 下载此手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


12.13 添加字符集

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

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

  • 如果字符集需要其中任何一项功能,那么它就是复杂的。

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

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

  1. <charset> 元素添加到 MYSETsql/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> 数组元素中的每个单词必须是十六进制格式的数字。

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