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/

文章可以转载,必须以链接形式标明出处。


本文转自 张冲andy 博客园博客,原文链接:http://www.cnblogs.com/andy6/p/5861782.html    ,如需转载请自行联系原作者
相关文章
|
2月前
|
SQL Oracle 关系型数据库
Oracle查询优化-计算字符在字符串中出现的次数
【2月更文挑战第3天】【2月更文挑战第7篇】只接上SQL
47 0
|
移动开发 JavaScript Oracle
Oracle根据汉字取拼音首字母的function
Oracle根据汉字取拼音首字母的function
5225 0
|
4月前
|
SQL Oracle 关系型数据库
Oracle之如何遍历字符串
Oracle之如何遍历字符串
44 1
|
1月前
|
SQL Oracle 关系型数据库
Oracle insert数据时字符串中有‘单引号问题
Oracle insert数据时字符串中有‘单引号问题
|
2月前
|
Oracle 关系型数据库
Oracle查询优化-在字符串删除特定字符
【2月更文挑战第4天】【2月更文挑战第8篇】比较灵活,列举三个常见的方式
50 0
|
2月前
|
Oracle 关系型数据库
Oracle查询优化-遍历字符串
【2月更文挑战第3天】【2月更文挑战第6篇】Oracle查询优化-遍历字符串
17 0
|
3月前
|
Oracle 关系型数据库 数据库
Oracle查询优化-按照数字和字母混合字符串中的字母排序
【1月更文挑战第3天】【1月更文挑战第7篇】在对Oracle数据库进行查询优化,尤其是按照数字和字母混合字符串中的字母进行排序时,可以使用多种方法来达到预期的结果。
31 0
|
5月前
|
SQL Oracle 关系型数据库
Oracle 插入时间时 ,报错:ORA-01861: 文字与格式字符串不匹配
Oracle 插入时间时 ,报错:ORA-01861: 文字与格式字符串不匹配
|
7月前
|
SQL Oracle 关系型数据库
oracle数据库中对汉字跟英文字母混合排序
oracle数据库中对汉字跟英文字母混合排序
54 0
|
Oracle 关系型数据库 数据处理
通过Oracle识别字符串中的中文or字母or数字来介绍全角半角转换函数(to_multi_byte/to_single_byte)在varchar/clob中的使用案例
在日常处理数据的过程中,大家肯定会遇到很多奇奇怪怪的字符,然后还要对这些字符处理,比如***你有个需求:识别字符串中的中文或是识别字母或是识别数字,甚至都识别出来然后剔除or保留某些字符汉字或数字***。 你去百度了一下相关问题,然后得到的结果大都是用正则 &#39;\4E00&#39; and &#39;\9FA5&#39;来识别中文范围用a-zA-z或0-9或[:digit:][:alpha:]来识别字母或数字。但是如果你的字符串中包含全角字符,那这样是识别不全的!!!那怎么做才能够正确的识别中文、字母、数字呢???那就要考虑先做全半
通过Oracle识别字符串中的中文or字母or数字来介绍全角半角转换函数(to_multi_byte/to_single_byte)在varchar/clob中的使用案例

推荐镜像

更多