您的位置:首页 > 数据库 > Oracle

ORACLE判别字段是否包含中文(P1)或中文包含非中文(P2)

2016-01-13 14:39 726 查看

Part.1ORACLE判别字段是否包含中文

在ORACLE数据库中如何查找那些字段里面包含中文的数据记录呢,有时候就是有这样的特殊需求,下面整理了一些判别字段中包含中文记录的几个方法

1:使用ASCIISTR函数判别

ASCIISTR函数说明:

ASCIISTR返回字符的ASCII形式的字符串。非ASCII的字符被转化为\xxxx的形式。

使用ASCIISTR函数也是根据非ASCII字符会被转化这个特性来判别中文字符,只要里面包含中文字符,则必定会有\xxx这样的字符。且简体汉字的编码范围是B0A1-F7FE.如下例子所示

CREATETABLETEST

(

NAME_ONECHAR(24)

,NAME_TWOVARCHAR2(24)

,NAME_THRNCHAR(24)

,NAME_FORNVARCHAR2(24)

)


INSERTINTOTEST

SELECT'abc10','abc20','abc30','abc40'FROMDUALUNIONALL

SELECT'abc11','abc21','abc31','abc41'FROMDUALUNIONALL

SELECT'abc12','abc22','abc32','abc42'FROMDUALUNIONALL

SELECT'abc1!','abc2!','abc3!','abc4!'FROMDUALUNIONALL

SELECT'abc1#','abc2#','abc3#','abc4#'FROMDUALUNIONALL

SELECT'abc1$','abc2$','abc3$','abc4$'FROMDUALUNIONALL

SELECT'ab测试1','ab测试2','ab测试3','ab测试4'FROMDUAL;






使用ASCIISTR(NAME_ONE)LIKE'%\%'就能判别那些有中文的记录。如下所示:

SELECTNAME_ONEFROMTESTWHEREASCIISTR(NAME_ONE)LIKE'%\%'


但是如果字段里面的非ASCII字符不仅仅有中文,例如还有日文之类,那么这个方法就不能准确判别了,如下所示,我插入一条包含日文的记录.



INSERTINTOTEST


SELECT'abこんにちは1','abこんにちは2','abこんにちは3','abこんにちは4'FROMDUAL;


COMMIT;



SQL>SELECTNAME_ONEFROMTESTWHEREASCIISTR(NAME_ONE)LIKE'%\%';


NAME_ONE

------------------------

ab测试1

abこんにちは1


2:使用CONVERT函数判别(比较有用)

CONVERT函数说明:

CONVERT(inputstring,dest_charset,source_charset)

inputstring:要转换的字符串

dest_charset:目标字符集

source_charset:原字符集

SQL>SELECT*FROMNLS_DATABASE_PARAMETERSWHEREPARAMETER='NLS_CHARACTERSET';


PARAMETERVALUE

----------------------------------------------------------------------

NLS_CHARACTERSETUTF8


SQL>SELECTNAME_ONE,NAME_TWOFROMTESTWHERENAME_ONE<>CONVERT(NAME_ONE,'ZHS16GBK','UTF8');


NAME_ONENAME_TWO

------------------------------------------------

ab测试1ab测试2

abこんにちは1abこんにちは2






3:使用函数length和lengthb来判别

使用函数length与lengthb来判别,是基于中文字符占用2~4个字节,而ASCII字符占用一个字节,那么对比LENGTH与LENGTHB就会不一样。这样就能判别字段中是否包含中文字符,但是跟ASCIISTR一样,如果里面的非ASCI字符包含非中文,它一样不能判别。依然有取巧嫌疑。



SELECTNAME_ONEFROMTESTWHERELENGTH(NAME_ONE)!=LENGTHB(NAME_ONE);





关于三者的性能,基本上都差不多,并没有那个性能要快一点。当然我没有详细、大量测试过,只是就某个案例的执行计划分析而已。

参考资料:

http://www.bitscn.com/pdb/oracle/201407/240540.html

/article/1684286.html

http://blog.itpub.net/9399028/viewspace-687789



作者:潇湘隐者
出处:http://www.cnblogs.com/kerrycode/

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.

Part.2


oralce查询字段中包含非中文字符的记录?

0


悬赏园豆:5[已解决问题]浏览:565次

如题,比如只有一个name列的表t1,数据如下:
  name  
  张三2
  李四
  王五*
要查出‘张三2’,‘王五*’两条记录,他们都包含非中文字符。

oracle数据库sql



yanwushu|菜鸟二级|园豆:204

提问于:2015-01-2416:02

问题补充:
更新
-----------------------------------------------------------------
尝试过使用正则表达式:
  selectcustomernamefromtransactionrecordwhereregexp_like(customername,'[^\u4e00-\u9fa5]')
  但是在oralce中测试无效。可能是由于字符集不同导致的不能工作?

参考:ORACLE判别字段是否包含中文

收获园豆:5

dudu|高人七级|园豆:35631|2015-01-24
16:13

感谢你的回答!
这篇文章已经参考过,但是没有找到解决方案,这篇文章是说,判断是否包含【中文字符】,而不是是否包含【非中文】字符。

yanwushu|园豆:204(菜鸟二级)|2015-01-24
16:25

@yanwushu:Oracle的SQL中的正则表达式不支持\u,要用unistr,参考Searching
UnicodecharactersinOracletable

dudu|园豆:35631(高人七级)|2015-01-24
16:39

@yanwushu:也就是:

selectcustomername
fromtransactionrecord
whereregexp_like(customername,'[^'||unistr('\4e00')||'-'||unistr('\9fa5')||']')


dudu|园豆:35631(高人七级)|2015-01-24
16:44

@dudu:感谢你的回答!
问题已经解决,sql如下:
selectcustomernamefromtransactionrecord

whereregexp_like(customername,'[^'||unistr('\4e00')||'-'||unistr('\9fa5')||']');

yanwushu|园豆:204(菜鸟二级)|2015-01-24
16:49
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: