在DB2 中创建一个获取汉字拼音首字母的SQL 函数
来源:qqread 作者: 出处:综艺读书 2007-03-26版权声明: 本文可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息。
原文出处: 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
·如何综合掌握 DB2 和 Informix 04-09
·用 AWK 实现 DB2 数据库 Schema 的同步 04-09
·关于IBM数据库DB2 9的九大特性简介 04-07
·DB2数据库应用系统性能优化深入探究 04-07
·DB2 9之优劣分析 04-04
·如何读取Excel数据并导入DB2数据库 03-29
·在Redhat Linux9上手动安装DB2 03-26
·在DB2 中创建一个获取汉字拼音首字母的SQL 函数 03-26
·学习笔记-DB2 UDB V8.1 管理 学习笔记(三) 03-26
|
|||
| ·ACDSEE专题教程-下载使用 ·迅雷专题教程-下载使用 ·Windows XP频道 ·Windows Vista频道 ·Windows 2000频道 ·win2003频道 ·Freebsd频道 ·Oracle频道 |
·Linux频道 ·Windows频道 ·邮件服务器专题 ·协议大全 ·数据恢复指南教程 ·FreeBSD使用教程 ·Linux数据库宝典 ·Linux基础知识 |
||
| · 秘密:Vista隐蔽的动态屏保 · 腾讯开发新电子宠物--QQ熊 · 惠普否认2999元PC有价无货 |
· 驱逐Win系统“流氓”文件 · WinXP中获取未使用的IP地址 · 尝试format C:格式化硬盘? |
| · 在DOS下恢复回收站中的文件 · 拯救WinXP崩溃的救命稻草 · Linux系统中超级权限的应用 |
· 搜狗PK谷歌:谁能代言拼... · 昨日重现,一键GHOST轻松.. · 实现Web迅雷在空闲时杀毒 |
| · AVIFile函数制做AVI文件 · VC中链接动态链接库的方法 · 熊猫烧香核心源码(Delphi) |
· DateDiff函数祥解 · JavaScript去除空格的三种 · js效果 图片加载进度实时.. |
| · SQL Server数据库优化方案 · Oracle的初学者入门心得 · JSP连接Mysql数据库 |
· Photoshop为美女做艺术处理 · 用Freehand创建发光字特效 · 设计自己的个性QQ动态表情 |
友情互链 | 收藏本站 | 联系我们 | 在线留言 | 京ICP备08008424号|




