本節討論將字元集新增至 MySQL 的程序。正確的程序取決於字元集是簡單還是複雜
如果字元集不需要用於排序的特殊字串排序常式,且不需要多位元組字元支援,則它是簡單的。
如果字元集需要這些功能中的任何一個,則它是複雜的。
例如,greek
和 swe7
是簡單的字元集,而 big5
和 czech
是複雜的字元集。
若要使用下列指示,您必須具有 MySQL 來源散佈。在指示中,MYSET
代表您想要新增的字元集名稱。
為
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;
此步驟取決於您新增的是簡單還是複雜的字元集。簡單的字元集只需要組態檔,而複雜的字元集則需要 C 原始檔來定義排序規則函式、多位元組函式或兩者。
對於簡單的字元集,請建立組態檔
,其中描述字元集屬性。在MYSET
.xmlsql/share/charsets
目錄中建立此檔案。您可以使用latin1.xml
的複本作為此檔案的基礎。檔案的語法非常簡單註解會寫入為一般的 XML 註解 (
<!--
)。text
--><map>
陣列元素中的文字會以任意數量的空白字元分隔。<map>
陣列元素中的每個文字都必須是十六進位格式的數字。<ctype>
元素的<map>
陣列元素具有 257 個文字。其後的其他<map>
陣列元素具有 256 個文字。請參閱第 12.13.1 節,「字元定義陣列」。對於
Index.xml
中字元集的<charset>
元素中列出的每個排序規則,
必須包含定義字元排序的MYSET
.xml<collation>
元素。
對於複雜的字元集,請建立 C 原始檔,其中描述字元集屬性,並定義適當執行字元集操作所需的支援常式
在
strings
目錄中建立檔案ctype-
。查看現有的MYSET
.cctype-*.c
檔案之一 (例如ctype-big5.c
) 以查看需要定義的內容。檔案中的陣列必須具有類似ctype_
、MYSET
to_lower_
等名稱。這些對應於簡單字元集的陣列。請參閱第 12.13.1 節,「字元定義陣列」。MYSET
對於
Index.xml
中字元集的<charset>
元素中列出的每個<collation>
元素,ctype-
檔案必須提供排序規則的實作。MYSET
.c如果字元集需要字串排序函式,請參閱第 12.13.2 節,「複雜字元集的字串排序支援」。
如果字元集需要多位元組字元支援,請參閱第 12.13.3 節,「複雜字元集的多位元組字元支援」。
修改組態資訊。使用現有組態資訊作為為
MYSYS
新增資訊的指南。此處的範例假設字元集具有預設和二進位排序規則,但如果MYSET
具有其他排序規則,則需要更多行。編輯
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
如果字元集使用
ctype-
,請編輯MYSET
.cstrings/CMakeLists.txt
,並將ctype-
新增至MYSET
.cSTRINGS_SOURCES
變數的定義中。編輯
cmake/character_sets.cmake
依字母順序將
MYSET
新增至CHARSETS_AVAILABLE
的值中。依字母順序將
MYSET
新增至CHARSETS_COMPLEX
的值中。即使是簡單的字元集也需要這麼做,這樣 CMake 才能識別-DDEFAULT_CHARSET=
。MYSET
重新設定、重新編譯並測試。