首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

DB2 使用者定義函數 (UDF) 實現多語言排序 - 基於 ICU 庫

     編輯:DB2 教學

問題背景

多語言資料存儲需 Unicode (UTF-8)。DB2 內建排序僅支援二進制與三種文化排序,且一個資料庫僅能指定一種排序規則 (建立時決定),無法滿足多語言混存環境的排序需求。

解決方案:ICU 庫 + UDF

IBM ICU (International Components for Unicode) 提供完整的 Unicode Collation Algorithm (UCA) 實作與文化調整功能。將 ICU 函數封裝為 DB2 UDF,即可在 SQL 中靈活指定任意語言排序規則。

  • DB2 LUW 內建的三種文化排序即基於 ICU
  • 適用 DB2 V8 LUW、Viper (V9)、理論上 V7 FP3+ 亦可
  • zSeries/iSeries 未測試

部署步驟

預編譯二進制檔 (Linux x86 / Windows 32位)

  1. 下載對應平台壓縮包 (sortkey-Linux-x86.zip / sortkey-Windows-32.zip)
  2. 解壓並將庫檔案複製至 sqllib/function 目錄:
    Linux: sortkey, libicui18n.so.34, libicuuc.so.34, libicudata.so.34
    Windows: sortkey.dll, icuin34.dll, icuuc34.dll, icudt34.dll
  3. 連接資料庫 (需 UTF-8 編碼):db2 connect to sample
  4. 執行 DDL 腳本註冊函數:db2 -tvf createfn.db2

自行編譯 (其他平台)

  1. 下載安裝 ICU 庫,設定 PATH/LIB/INCLUDE
  2. 下載 sortkey-source.zip,複製並修改 sqllib/samples/c/bldrtn (或 .bat):
    Linux: 加入 ICU_C_FLAGS/ICU_L_FLAGS 至編譯/鏈接命令 (用 icu-config 取得)
    Windows: 鏈接命令加入 icudt.lib icuuc.lib icuin.lib
  3. 執行 bldrtn sortkey 編譯
  4. 複製產生的 sortkey/sortkey.dll 至 sqllib/function,執行 createfn.db2 註冊

注意:自行編譯的 UDF 要求執行機器完整安裝 ICU。

SORTKEY UDF 使用說明

語法

SORTKEY(string-expression, collation-name) RETURNS VARCHAR(1200) FOR BIT DATA
  • Schema: ICU (若在 SQL PATH 中可省略)
  • 結果可為 NULL (任一參數為 NULL)
  • 長度超過 1200 字節會截斷並警告 (SQLSTATE 01HKY)

參數

  • string-expression: CHAR/VARCHAR/GRAPHIC/VARGRAPHIC,最大 100 字元,非 FOR BIT DATA。空字串回傳有效排序鍵。
  • collation-name: 排序規則名稱,不分大小寫。空字串 = 預設 UCA。有效值見「排序規則名」定義 (SQLSTATE SKCOL)。
  • 必須從 Unicode 資料庫呼叫 (SQLSTATE SKUTF)。

核心應用場景

  1. ORDER BY 多語言排序:
    SELECT NAME FROM T ORDER BY ICU.SORTKEY(NAME, 'LEN') (英語)
    SELECT NAME FROM T ORDER BY ICU.SORTKEY(NAME, 'LSK') (斯洛伐克語,CH 排在 H/I 間)
  2. 跨表規範化 JOIN:
    德語城市名 Nürnberg vs Nuernberg、Köln vs Koeln。
    普通 JOIN 無法匹配。使用 ICU.SORTKEY(CITY, 'LDE_KPHONEBOOK_S1') (電話簿規則、強度 1 忽略重音) 後比較排序鍵,可正確匹配。
    WHERE ICU.SORTKEY(G1.CITY, 'LDE_KPHONEBOOK_S1') = ICU.SORTKEY(G2.CITY, 'LDE_KPHONEBOOK_S1')

效能優化策略

  1. 使用固定排序規則名:準備排序規則開銷大。避免在查詢中逐行動態計算 (如 ICU.SORTKEY(NAME, LANGUAGE)),改用字面值或主機變數。
  2. 最小化 SORTKEY 呼叫:資料一致時優先用標準比較,僅最終 ORDER BY 使用 SORTKEY。
  3. 使用生成欄預計算:常用排序規則建立生成欄儲存排序鍵:
    NAME_FR_KEY VARCHAR(1200) GENERATED ALWAYS AS (ICU.SORTKEY(NAME, 'LFR'))
    優化器會自動替換。注意儲存空間 (每輸入字元約 12 位元組),可用 CAST(... AS VARCHAR(600)) 或包裝函數 MY_SORTKEY 縮短長度。

總結

ICU-based SORTKEY UDF 為 DB2 提供了工業級的多語言排序能力,彌補內建排序的侷限。配合生成欄優化,可在生產環境高效支援多語言應用的排序與 JOIN 需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved