Oracle中如何判斷一個字符串是否含有漢字


看到網友問,怎么查詢表中某個字段數據是不是包含了全角字符啊? 這個問題涉及到幾個函數:to_single_byte、length和lengthb,我之前做開發的時候研究的是如何判斷一個字符串中是否包含中文,其實和這個本質是一樣的,且看實驗部分。

 

 

1  實驗部分

 

1.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');

 

 

 

1.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;

 

 

 

1.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;

 

 

1.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)));

 

 zhuan :http://blog.itpub.net/26736162/viewspace-1688209/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM