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