在 GBK 編碼環境下,漢字儲存順序恰好遵循拼音字母序(含聲調)。例如 B0A0-1 至 B0C0-5 區間對應拼音「A」開頭的所有漢字,且「澳」為該組內碼最大者。同理可推導出 26 個拼音首字母對應的「邊界漢字」:
'澳' a '怖' b '錯' c '墮' d '貳' e '咐' f '過' g '禍' h
i '駿' j '闊' k '絡' l '穆' m '諾' n '漚' o '瀑' p
'群' q '弱' r '所' s '唾' t u v '誤' w '迅' x
'孕' y '座' z
註:漢語拼音無 i、u、v 開頭漢字,故以同組前一字母漢字佔位。
任取一漢字,置於上述 26+3 個邊界漢字構成的有序集合中,利用資料庫 GBK 排序一次,即可依其相對位置精準判斷拼音首字母。
SELECT t1.strChn
FROM (
SELECT '澳' strChn FROM sysibm.sysdummy1 UNION ALL
SELECT '怖' FROM sysibm.sysdummy1 UNION ALL
SELECT '錯' FROM sysibm.sysdummy1 UNION ALL
SELECT '墮' FROM sysibm.sysdummy1 UNION ALL
SELECT '貳' FROM sysibm.sysdummy1 UNION ALL
SELECT '咐' FROM sysibm.sysdummy1 UNION ALL
SELECT '過' FROM sysibm.sysdummy1 UNION ALL
SELECT '禍' FROM sysibm.sysdummy1 UNION ALL
SELECT '禍' FROM sysibm.sysdummy1 UNION ALL -- i 佔位
SELECT '駿' FROM sysibm.sysdummy1 UNION ALL
SELECT '闊' FROM sysibm.sysdummy1 UNION ALL
SELECT '絡' FROM sysibm.sysdummy1 UNION ALL
SELECT '穆' FROM sysibm.sysdummy1 UNION ALL
SELECT '諾' FROM sysibm.sysdummy1 UNION ALL
SELECT '漚' FROM sysibm.sysdummy1 UNION ALL
SELECT '瀑' FROM sysibm.sysdummy1 UNION ALL
SELECT '群' FROM sysibm.sysdummy1 UNION ALL
SELECT '弱' FROM sysibm.sysdummy1 UNION ALL
SELECT '所' FROM sysibm.sysdummy1 UNION ALL
SELECT '唾' FROM sysibm.sysdummy1 UNION ALL
SELECT '唾' FROM sysibm.sysdummy1 UNION ALL -- u 佔位
SELECT '唾' FROM sysibm.sysdummy1 UNION ALL -- v 佔位
SELECT '誤' FROM sysibm.sysdummy1 UNION ALL
SELECT '迅' FROM sysibm.sysdummy1 UNION ALL
SELECT '孕' FROM sysibm.sysdummy1 UNION ALL
SELECT '座' FROM sysibm.sysdummy1
) AS t1
實際函數 getIndex 另加入英文字母直通邏輯,編譯後可直接調用:
SELECT getIndex('索') AS index FROM dual;
-- 回傳: f
db2 connect to db_name user user_name using passWord
db2 get db cfg | grep -i 'code set'
注意:字符集參數在建庫後不可修改,請在建庫階段確認。
這個「借力內碼順序」的巧思,展現了深諳資料庫底層特性所能釋放的極致效能與簡潔代碼之美。