多語言資料存儲需 Unicode (UTF-8)。DB2 內建排序僅支援二進制與三種文化排序,且一個資料庫僅能指定一種排序規則 (建立時決定),無法滿足多語言混存環境的排序需求。
IBM ICU (International Components for Unicode) 提供完整的 Unicode Collation Algorithm (UCA) 實作與文化調整功能。將 ICU 函數封裝為 DB2 UDF,即可在 SQL 中靈活指定任意語言排序規則。
sortkey-Linux-x86.zip / sortkey-Windows-32.zip)sqllib/function 目錄:sortkey, libicui18n.so.34, libicuuc.so.34, libicudata.so.34sortkey.dll, icuin34.dll, icuuc34.dll, icudt34.dll
db2 connect to sampledb2 -tvf createfn.db2PATH/LIB/INCLUDEsortkey-source.zip,複製並修改 sqllib/samples/c/bldrtn (或 .bat):ICU_C_FLAGS/ICU_L_FLAGS 至編譯/鏈接命令 (用 icu-config 取得)icudt.lib icuuc.lib icuin.lib
bldrtn sortkey 編譯sortkey/sortkey.dll 至 sqllib/function,執行 createfn.db2 註冊注意:自行編譯的 UDF 要求執行機器完整安裝 ICU。
SORTKEY(string-expression, collation-name) RETURNS VARCHAR(1200) FOR BIT DATA
ICU (若在 SQL PATH 中可省略)string-expression: CHAR/VARCHAR/GRAPHIC/VARGRAPHIC,最大 100 字元,非 FOR BIT DATA。空字串回傳有效排序鍵。collation-name: 排序規則名稱,不分大小寫。空字串 = 預設 UCA。有效值見「排序規則名」定義 (SQLSTATE SKCOL)。SELECT NAME FROM T ORDER BY ICU.SORTKEY(NAME, 'LEN') (英語)SELECT NAME FROM T ORDER BY ICU.SORTKEY(NAME, 'LSK') (斯洛伐克語,CH 排在 H/I 間)Nürnberg vs Nuernberg、Köln vs Koeln。ICU.SORTKEY(CITY, 'LDE_KPHONEBOOK_S1') (電話簿規則、強度 1 忽略重音) 後比較排序鍵,可正確匹配。WHERE ICU.SORTKEY(G1.CITY, 'LDE_KPHONEBOOK_S1') = ICU.SORTKEY(G2.CITY, 'LDE_KPHONEBOOK_S1')ICU.SORTKEY(NAME, LANGUAGE)),改用字面值或主機變數。NAME_FR_KEY VARCHAR(1200) GENERATED ALWAYS AS (ICU.SORTKEY(NAME, 'LFR'))CAST(... AS VARCHAR(600)) 或包裝函數 MY_SORTKEY 縮短長度。ICU-based SORTKEY UDF 為 DB2 提供了工業級的多語言排序能力,彌補內建排序的侷限。配合生成欄優化,可在生產環境高效支援多語言應用的排序與 JOIN 需求。