文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式 Letter) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
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. 重新組態、重新編譯並測試。