文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美國信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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 號碼。從 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. 重新設定、重新編譯並測試。