oracle u4e00 u9fa5,Oracle 判断汉字 [\u4e00-\u9fa5]

最近由于单位提了一个需求,要判断提供的用户名称里不有全角字符,至少有两个汉字。找了半天,想通过正则表达式来解决,但测试了好久才发现,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;

/**

用途:   返回字符串中汉字的个数

原理说明:  因为汉字的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;

查询结果:

df006fd804dd25d6defcb1762ac8adee.png

还可以使用正则表达式判断非中文汉字字符:

select 字段 from 表名

where regexp_like(字段 , '[^' || unistr('\4e00') || '-' || unistr('\9fa5') || ']');

来源:oschina

链接:https://my.oschina.net/u/163737/blog/525389

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值