查看: 14489|回复: 15

[笔记] oracle判断汉字和全角字符的方法

[复制链接]
论坛徽章:
2
参与2009年中国云计算大会纪念
日期:2009-06-05 10:02:28优秀写手
日期:2014-03-07 06:00:13
跳转到指定楼层
1#
发表于 2014-3-5 13:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近由于单位提了一个需求,要判断提供的用户名称里不有全角字符,至少有两个汉字。找了半天,想通过正则表达式来解决,但测试了好久才发现,oracle的正则函数REGEXP_LIKE 不支持“\un 匹配 n,其中 n 是以四位十六进制数表示的 Unicode 字符”的判断,例如,\u00A9 匹配版权符号 (&copy,而标准的正则是可以支持的,所以这个办法行不通,只能过期其他办法来实现。
在网上找了半天,都没有确切的实现办法,有通过Length()和lengthb ()来判断,但不完美,都不太所以就把自己的写法记录下来希望能有用处。
对于全角字符,ascii值的范围是\uFF00-\uFFFF,都是FF段的,所以可以通过转换成ascii 来判断,instr(asciistr(replace( '在《<23\', '\')),'\FF',1,1) > 0 就可以实现
对于汉字,范围太大,只能通过函数来完成,于是写了如下函数:
create or replace function get_chinese(v_name in varchar2) return integer is
  i       int;
  v_count integer;
  v_code  varchar2(10);
begin
  v_count := 0;
  /**
  作者:背包去流浪
  QQ:380140243
  用途:   返回字符串中汉字的个数
  原理说明:  因为汉字的ASCII码值在4E00和9FA5之间,所以,可以将字符串转为ASCII后,判断连续的5位是否在这个范围,
  是则为汉字,否则为其他字符。
  返回值:    汉字个数
  异常返回:  -1
   */
  for i in 1 .. lengthb(asciistr(v_name)) - 4 loop  
    --if substr(asciistr(v_name),i,1)='\' then --有\则判断是否汉字
    v_code := substr(asciistr(v_name), i, 5);
    IF V_CODE BETWEEN '\4E00' AND '\9FA5' THEN
      --汉字的asciid码值范围
      v_count := v_count + 1; --有一个汉字
    end if;
    -- dbms_output.put_line(v_code);
  -- end if;
  end loop;
  return v_count;
exception
  when others then
    return - 1; --异常返回-1
end get_chinese;
查询结果:

求职 : 数据库管理员
论坛徽章:
71
2011新春纪念徽章
日期:2015-05-19 13:15:06itpub13周年纪念徽章
日期:2014-09-28 13:09:30马上有对象
日期:2014-10-16 14:28:04马上加薪
日期:2014-11-10 10:43:10马上加薪
日期:2014-12-02 10:42:48马上有房
日期:2014-12-12 14:28:33马上有车
日期:2014-12-16 09:29:54马上加薪
日期:2014-12-22 17:00:50马上有对象
日期:2015-01-05 17:32:582010新春纪念徽章
日期:2015-01-23 11:01:59
2#
发表于 2014-3-5 14:08 | 只看该作者
nice!

使用道具 举报

回复
求职 : 数据库管理员
招聘 : Java研发
论坛徽章:
6402
娜美
日期:2021-10-12 20:11:36技术图书徽章
日期:2021-09-30 12:11:1120周年集字徽章-年	
日期:2021-09-30 12:12:5820周年集字徽章-20	
日期:2021-09-30 12:43:0619周年集字徽章-周
日期:2021-09-30 13:18:3120周年集字徽章-20	
日期:2021-09-30 16:44:1219周年集字徽章-周
日期:2021-09-30 17:01:04技术图书徽章
日期:2021-09-30 17:59:14技术图书徽章
日期:2021-10-06 10:36:4019周年集字徽章-19
日期:2021-10-06 14:43:24
3#
发表于 2014-3-5 15:18 | 只看该作者
学习了!
老总的徽章不错!
求送~~~~

使用道具 举报

回复
求职 : 数据库管理员
招聘 : 系统架构师
论坛徽章:
4
ITPUB十周年纪念徽章
日期:2011-11-01 16:25:22ITPUB社区千里马徽章
日期:2013-08-22 09:58:032014年新春福章
日期:2014-02-18 16:43:09马上有钱
日期:2014-02-18 16:43:09
4#
发表于 2014-3-7 16:51 | 只看该作者
楼上的ID亮了

使用道具 举报

回复
论坛徽章:
2
参与2009年中国云计算大会纪念
日期:2009-06-05 10:02:28优秀写手
日期:2014-03-07 06:00:13
5#
 楼主| 发表于 2014-3-7 17:02 | 只看该作者
uang520 发表于 2014-3-7 16:51
楼上的ID亮了

确实很亮。

使用道具 举报

回复
论坛徽章:
40
2014年新春福章
日期:2014-02-18 16:43:09喜羊羊
日期:2015-05-18 16:24:25慢羊羊
日期:2015-06-12 13:08:22暖羊羊
日期:2015-07-02 16:06:20暖羊羊
日期:2015-07-06 16:28:55狮子座
日期:2015-07-29 17:14:43摩羯座
日期:2015-09-02 13:58:47白羊座
日期:2015-09-08 10:39:06天枰座
日期:2015-09-17 21:41:53摩羯座
日期:2015-10-29 21:07:02
6#
发表于 2014-3-7 22:30 | 只看该作者
收藏了。

使用道具 举报

回复
论坛徽章:
0
7#
发表于 2014-3-8 15:33 | 只看该作者

使用道具 举报

回复
论坛徽章:
13
2014年新春福章
日期:2014-02-18 16:50:09秀才
日期:2015-12-21 09:48:112014数据库大会纪念章
日期:2015-03-18 10:16:212013数据库大会纪念章
日期:2015-03-18 10:16:212012数据库大会纪念章
日期:2015-03-18 10:16:212011数据库大会纪念章
日期:2015-03-18 10:16:212010数据库技术大会纪念徽章
日期:2015-03-18 10:16:21知识
日期:2015-03-10 11:53:27蓝锆石
日期:2015-02-03 13:52:43马上有钱
日期:2014-04-06 13:16:31
8#
发表于 2014-3-9 18:49 来自手机 | 只看该作者
nice,

使用道具 举报

回复
论坛徽章:
22
2010新春纪念徽章
日期:2010-03-01 11:06:29福特
日期:2013-11-06 19:08:01保时捷
日期:2013-11-15 07:54:26问答徽章
日期:2013-11-24 20:31:08马上有对象
日期:2014-03-20 13:07:43itpub13周年纪念徽章
日期:2014-10-08 15:13:38懒羊羊
日期:2015-03-04 14:48:162015年新春福章
日期:2015-03-06 11:57:31摩羯座
日期:2015-10-12 10:03:31蒙奇·D·路飞
日期:2017-06-19 23:56:57
9#
发表于 2014-3-14 13:59 | 只看该作者
收藏。

使用道具 举报

回复
论坛徽章:
0
10#
发表于 2014-5-8 12:15 | 只看该作者
全角字符咋验证?这只验证汉字。。。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表