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

DB2 使用者定義函數實現多語言排序:基於 ICU 庫的 SORTKEY UDF 實戰

     編輯:DB2 教學

問題背景:Unicode 資料的排序困境

在 DB2 UDB 資料庫儲存多語系資料時,Unicode 常為唯一能適應完整資料範圍的編碼。DB2 可儲存處理 Unicode 資料,但排序功能僅限二進位排序與三種文化排序,且一個資料庫僅能有一種排序規則(建立時決定)。對需支援多語言的使用者與資料,此限制顯然棘手。

IBM 建立管理 Unicode 資料的函數庫 ICU (International Components for Unicode),為 C 與 Java 提供完整操作 Unicode 資料的函數,以無限制開源授權釋出,廣泛適用。ICU 實作標準 Unicode Collation Algorithm (UCA) 及眾多文化調整功能。將適當 ICU 函數組合成 UDF(使用者定義函數),即可讓 DB2 充分利用 ICU 排序支援(註:DB2 for Linux, UNIX, Windows 即用 ICU 庫實現三種文化排序)。

本文針對 DB2 V8 for Linux, UNIX, Windows,UDF 範例亦適用即將發布的 Viper,理論上可用於 DB2 V7 FP3+(未測試),或許適用 zSeries/iSeries(未測試、本文不討論)。

安裝範例資料庫

假設資料庫名為 SAMPLE,實際可用任意 Unicode 資料庫。判斷是否 Unicode 資料庫:

db2 get database configuration for sample

Database code page 須為 utf-8。無 Unicode 資料庫時可建立:

db2 create database sample using codeset utf-8 territory ca

預建二進位碼安裝

Linux (32-bit Intel/AMD)

  1. 下載 sortkey-Linux-x86.zip 解壓至暫存目錄
  2. 複製 sortkey、libicui18n.so.34、libicuuc.so.34、libicudata.so.34 至 sqllib/function
  3. 連線資料庫執行 DDL 腳本編目函數:db2 connect to sample && db2 -tvf createfn.db2

註:Linux 預建碼於 Red Hat Linux 7.2 用 gcc 2.96 編譯。

Windows (32-bit)

  1. 下載 sortkey-Windows-32.zip 解壓
  2. 複製 sortkey.dll、icuin34.dll、icuuc34.dll、icudt34.dll 至 sqllib/function
  3. DB2 命令視窗連線執行 DDL:db2 connect to sample && db2 -tvf createfn.db2

自行編譯 ICU 與 UDF

  1. 下載安裝 ICU 庫(參考資料含 ICU 網站連結),視需要將 ICU 執行檔目錄加入 PATH;Windows 另需更新 LIB(指向 iculib)與 INCLUDE(指向 icuinclude)環境變數
  2. 下載 sortkey-source.zip 解壓;複製 sqllib/samples/c/bldrtn (Windows 為 bldrtn.bat) 至暫存目錄並編輯,編譯連結步驟加入 ICU 資訊
  3. Linux/UNIX:定義 ICU_C_FLAGS、ICU_L_FLAGS 加入編譯連結命令(清單 1)
  4. Windows:連結命令加入 ICU 庫(清單 2)
  5. 執行 bldrtn sortkey 編譯 UDF
  6. 複製 sortkey (Windows 為 sortkey.dll) 至 sqllib/function,連線資料庫執行 DDL 編目

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

清單 1. 修改的 Linux bldrtn 檔案

# If an embedded SQL program, precompile and bind it.
if [ -f $1".sqc" ]; then ./embprep $1 $2; fi
# ICU options
ICU_C_FLAGS="`icu-config --cppflags --cxxflags`"
ICU_L_FLAGS="`icu-config --ldflags`"
# Compile the program.
$CC $ICU_C_FLAGS $EXTRA_C_FLAGS -I$DB2PATH/include -c $1.c -D_REENTRANT
# Link the program and create a shared library
$CC $ICU_L_FLAGS $LINK_FLAGS -o $1 $1.o $EXTRA_LFLAG -L$DB2PATH/$LIB -ldb2 -lpthread

清單 2. 修改的 Windows bldrtn.bat 檔案

:link_step
rem Link the program.
link -debug -out:%1.dll -dll %1.obj db2api.lib icudt.lib icuuc.lib icuin.lib -def:%1.def

使用 SORTKEY UDF

語法

>>--SORTKEY--(--string-expression--,--collation-name--)--><

UDF 結構描述為 ICU。若 ICU 在 SQL PATH 中,無需顯式限定。SORTKEY 回傳 VARCHAR(1200) FOR BIT DATA 字串,代表指定 collation-name 中 string-expression 的排序鍵。長度超過 1200 位元組時截斷並回傳警告 (SQLSTATE 01HKY)。結果可為 NULL,任一參數為 NULL 則結果為 NULL。

可對兩字串的 SORTKEY 結果做二進位比較,判斷其在指定排序規則中的次序。比較需來自相同 collation-name 的結果始有意義。

參數說明

  • string-expression:回傳 CHAR/VARCHAR/GRAPHIC/VARGRAPHIC 字串,UDF 判斷其排序鍵。最大長度 100 字元 (SQLSTATE 22001)。若為 CHAR/VARCHAR 不可為 FOR BIT DATA (SQLSTATE 42846)。空字串回傳非零長度有效排序鍵。
  • collation-name:指定判斷排序鍵所用排序規則。不區分大小寫,必須為空字串(對應預設 UCA 排序)或「排序規則名」中定義名稱 (SQLSTATE SKCOL)。

必須從 Unicode 資料庫呼叫 SORTKEY,否則報錯 (SQLSTATE SKUTF)。

範例執行

example.db2 含 UTF-8 編碼字元。理想從 Unicode shell 執行範例。非 Unicode shell 時,SORTKEY_GERMAN1、SORTKEY_GERMAN2 表會含錯誤資料,範例 4 失敗。允許非 Unicode shell 執行可設 DB2CODEPAGE=1208(DB2 客戶端以 UTF-8 處理資料),重音字元無法正確顯示但範例可正確執行:

db2 terminate
db2set DB2CODEPAGE=1208
db2 connect to sample
db2 -tf example.db2

執行後可恢復:db2 terminate && db2set DB2CODEPAGE=。範例使用的表、資料、查詢在 example.db2 中,連線資料庫時用 db2 -tf example.db2 執行。

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