本節討論將字元集新增至 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_、MYSETto_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
重新組態、重新編譯並測試。