Username: Password:

在DB2 中创建一个获取汉字拼音首字母的SQL 函数-数据库专栏,DB2
来源:作者: 发布时间:2007-12-25 13:44:09


版权声明: 本文能够任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息。
原文出处: http://www.aiview.com/notes/index_of_chinese.htm
作者: 张洋 alex_doesathotmail.com
最后更新: 2003-12-25
 目录 需求 工作原理 实现 参考资源
  需求
有些时候我们会有这样的需求,需要使用字母从a至z对一组数据进行索引,假如数据的格式全部是半角的英文则很容易实现,但若是对一组中文数据进行索引则会引起一点小的麻烦,数据在录入数据库的时候可能并没有指定一个索引字母,这就需要应用程式能够自动生成用于索引的信息。

一般对于中文数据的索引,采用词组的首汉字拼音的首字母,例如:

词组 索引字母
--- -----
熊猫 x
白暨豚 b
藏野驴 z

在db2中并没有提供相应的函数能够取得汉字拼音的首字母,我们能够利用数据库针对中文字符集的排序功能创建一个这样的函数。
工作原理
我们知道在使用中文字符集的数据库中,当您对一列中文数据使用order by 排序时,排序的结果正是按照每行记录第一个汉字的拼音首字母进行排列的,那么我们需要想办法取得这个字母。
但是数据库内部是怎样做到这一点的呢?以中文字符集gbk为例,让我们查看一下gbk字符集的内码表,我们仅摘出一段:

0 1 2 3 4 5 6 7 8 9 a b c d e f 
b040 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 
b050 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 
b060 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 
b070 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 
b080 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 
b090 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 
b0a0 ? 啊 阿 埃 挨 哎 唉 哀 皑 癌 蔼 矮 艾 碍 爱 隘 
b0b0 鞍 氨 安 俺 按 暗 岸 胺 案 肮 昂 盎 凹 敖 熬 翱 
b0c0 袄 傲 奥 懊 澳 芭 捌 扒 叭 吧 笆 八 疤 巴 拔 跋 
b0d0 靶 把 耙 坝 霸 罢 爸 白 柏 百 摆 佰 败 拜 稗 斑 
b0e0 班 搬 扳 般 颁 板 版 扮 拌 伴 瓣 半 办 绊 邦 帮 
b0f0 梆 榜 膀 绑 棒 磅 蚌 镑 傍 谤 苞 胞 包 褒 剥 

能够看到从b0a0-1 开始,至b0c0-5,是拼音a开头的汉字,恰好是按照拼音字母的先后顺序排列,并且把音调的因素也考虑进去了,由此,能够推断出,数据库在gbk编码的数据库中对汉字进行排序,即是依照字符内码表的编码进行的。
我们把b0c0-5 位置的汉字记录下来,即“澳”字,这是以“a”拼音开头在内码表中排列在最后的汉字,用同样的方法,我们找出任何以拼音从b至z开头,在内码表中排列在最后的汉字,和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开头的汉语拼音。

现在假若我们拿出任何一个汉字,放在我们挑选出的这些汉字中间,利用数据库进行一次使用gbk字符集的排序,我们便能够根据这个汉字排列的相对位置得到其拼音首字母。

利用sql语句生成一组上述汉字的结果集,我们将i,u,v 三个空缺汉字的位置补上了上一个拼音的汉字,

select t1.strchn 
from ( select 澳 strchn from sysibm.sysdummy1 
union all 
select 怖 strchn from sysibm.sysdummy1 
union all 
select 错 strchn from sysibm.sysdummy1 
union all 
select 堕 strchn from sysibm.sysdummy1 
union all 
select 贰 strchn from sysibm.sysdummy1 
union all 
select 咐 strchn from sysibm.sysdummy1 
union all 
select 过 strchn from sysibm.sysdummy1 
union all 
select 祸 strchn from sysibm.sysdummy1 
union all 
select 祸 strchn from sysibm.sysdummy1 
union all 
select 骏 strchn from sysibm.sysdummy1 
union all 
select 阔 strchn from sysibm.sysdummy1 
union all 
select 络 strchn from sysibm.sysdummy1 
union all 
select 穆 strchn from sysibm.sysdummy1 
union all 
select 诺 strchn from sysibm.sysdummy1 
union all 
select 沤 strchn from sysibm.sysdummy1 
union all 
select 瀑 strchn from sysibm.sysdummy1 
union all 
select 群 strchn from sysibm.sysdummy1 
union all 
select 弱 strchn from sysibm.sysdummy1 
union all 
select 所 strchn from sysibm.sysdummy1 
union all 
select 唾 strchn from sysibm.sysdummy1 
union all 
select 唾 strchn from sysibm.sysdummy1 
union all 
select 唾 strchn from sysibm.sysdummy1 
union all 
select 误 strchn from sysibm.sysdummy1 
union all 
select 迅 strchn from sysibm.sysdummy1 
union all 
select 孕 strchn from sysibm.sysdummy1 
union all 
select 座 strchn from sysibm.sysdummy1 
) as t1
实现
接下来很方便的就能够写出这个函数的具体实现,在实现的代码中,我们又加入了针对英文字母的处理,函数编译后,可通过如下方式调用:

select getindex( 索 ) index from dual;

index
------
f

下载代码


实际使用中,应注意建立数据库时字符集参数的配置,应使用gbk字符集。
应用以下命令查看已建立数据库的字符集:

db2 connect to db_name user user_name using password
db2 get db cfg | grep -i code set

此参数在数据库建立之后不能修改。
参考资源
下载函数的源代码
gbk 字符集编码表:
http://www.khngai.com/chinese/charmap/tblgbk.php?page=0


喜欢本文,那就收藏到:

    Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪ViVi 365Key网摘 天极网摘 和讯网摘 博拉网 POCO网摘 添加到饭否 QQ书签 Digbuzz我挖网
相关评论  我也要评论
还没有关于此文章的相关评论!
  • 昵称: (为空则显示guest)
  • 评论分数: ★ ★ ★★★ ★★★★ ★★★★★
  • 评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
  • 导航
    赞助商
    文章类别
    订阅