各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~:

①全角字符的判断,或者是含有汉字的字符串的判断

本文如有错误或不完善的地方请大家多多指正,ITPUB留言或QQ皆可,您的批评指正是我写作的最大动力。

一.2.2 实验环境介绍

11.2.0.3  RHEL6.5

一.2.3 本文简介

看到网友问,怎么查询表中某个字段数据是不是包含了全角字符啊? 这个问题涉及到几个个函数:to_single_byte、length和lengthb,我之前做开发的时候研究的是如何判断一个字符串中是否包含中文,其实和这个本质是一样的,且看实验部分。

一.3 实验部分

一.3.1 lengthb和length函数结合to_single_byte函数

---含有汉字,严格的说是含有全角字符

SELECT l.name ,

length ( l.name ),

lengthb ( l.name )

FROM   xb_link l

WHERE length ( l.name ) != lengthb ( l.name )

AND length ( l.name ) < 20 ;

以下数据也满足条件:

SELECT l.id ,

l.name

FROM   xb_link l

WHERE length ( l.name ) != lengthb ( l.name )

AND    l.metacategory IN

( 'com.gxlu.ngrm.network.DDNCircuit' ,

'com.gxlu.ngrm.network.FRCircuit' ,

'com.gxlu.ngrm.network.ATMCircuit' ,

'com.gxlu.ngrm.network.DDNOCircuit' ,

'com.gxlu.ngrm.network.FROCircuit' )

AND    l.id IN ( '301898331' , '301898335' , '301908187' , '301929403' );

所以可以借助to_single_byte函数来解决。

SELECT l.id ,

l.name ,

to_single_byte ( l.name ),

length ( l.name ) l1 ,

lengthb ( l.name ) l2 ,

length ( to_single_byte ( l.name )) l

FROM   xb_link l

WHERE length ( l.name ) != lengthb ( l.name )

AND    l.metacategory IN

( 'com.gxlu.ngrm.network.DDNCircuit' ,

'com.gxlu.ngrm.network.FRCircuit' ,

'com.gxlu.ngrm.network.ATMCircuit' ,

'com.gxlu.ngrm.network.DDNOCircuit' ,

'com.gxlu.ngrm.network.FROCircuit' )

AND    l.id IN ( '301898331' , '301898335' , '301908187' , '301929403' );

一.3.2 regexp_replace --替换其它字符为’’

SELECT

l.id ,

l.name

FROM   xb_link l

WHERE  regexp_replace ( TRIM ( l.name ),

'([A-Za-z0-9]|[[:punct:]]|[[:space:]])' ,

'' ) IS NOT NULL;

一.3.3 to_multi_byte 函数--全是全角字符

---全是汉字

SELECT l.name ,

to_multi_byte ( l.name )

FROM   xb_link l

WHERE  l.name = to_multi_byte ( l.name );

SELECT l.name ,

to_multi_byte ( l.name )

FROM   xb_link l;

一.3.4 网友问题解答:某个字段数据是不是包含了全角字符?

drop table aa ;

create table aa ( col   varchar2 (255));

SELECT * FROM aa for update ;

SELECT a.col ,

to_single_byte ( a.col ),

length ( a.col ),

lengthb ( a.col ),

length ( to_single_byte ( a.col )),

lengthb ( to_single_byte ( a.col ))

FROM   aa a

WHERE ( lengthb ( a.col ) - length ( a.col )) <>

( lengthb ( to_single_byte ( a.col )) - length ( to_single_byte ( a.col )));

一.4 总结

方法很简单,网友可能还有其他的办法,欢迎留言,对于不同的场景处理方式有很多种,我们应该学会灵活变通。

一.5 About Me

...........................................................................................................................................................................................

本文作者:小麦苗,只专注于数据库的技术,更注重技术的运用

ITPUB BLOG: http://blog.itpub.net/26736162

本文地址: http://blog.itpub.net/26736162/viewspace-1688209/

本文pdf版: http://yunpan.cn/QCwUAI9bn7g7w 提取码:af2d

QQ:642808185 若加QQ请注明你所正在读的文章标题

创作时间地点:2015-06-05 10:00~ 2015-06-05 13:00 于外汇交易中心

...........................................................................................................................................................................................

本文转自lhrbest 51CTO博客,原文链接:http://blog.51cto.com/lhrbest/1658869 ,如需转载请自行联系原作者

通过Oracle识别字符串中的中文or字母or数字来介绍全角半角转换函数(to_multi_byte/to_single_byte)在varchar/clob中的使用案例
在日常处理数据的过程中,大家肯定会遇到很多奇奇怪怪的字符,然后还要对这些字符处理,比如***你有个需求:识别字符串中的中文或是识别字母或是识别数字,甚至都识别出来然后剔除or保留某些字符汉字或数字***。 你去百度了一下相关问题,然后得到的结果大都是用正则 '\4E00' and '\9FA5'来识别中文范围用a-zA-z或0-9或[:digit:][:alpha:]来识别字母或数字。但是如果你的字符串中包含全角字符,那这样是识别不全的!!!那怎么做才能够正确的识别中文、字母、数字呢???那就要考虑先做全半
Oracle截取JSON字符串内容1 CREATE OR REPLACE FUNCTION PLATFROM.parsejsonstr(p_jsonstr varchar2,startkey varchar2,endkey varchar2) RETURN VARCHAR2 2 IS 3 rt... 可以有2种办法来判断,第一种办法为REPLACE加TRANSLATE函数,在程序中可以直接使用“TRANSLATE(REPLACE('入参','.',''),'/1234567890','/') IS NULL”来判断入参为数字,缺点是,若入参有2个小数点或含有加减号则不能判断。 Oracle 一个中文汉字 占用几个字节,要根据Oracle中字符集编码决定 查看oracle server端字符集 select userenv('language') from dual; 如果显示如下,一个汉字占用两个字节 SIMPLIFIED CHINESE_CHINA.