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);
关于三者的性能,基本上都差不多,并没有那个性能要快一点。当然我没有详细、大量测试过,只是就某个案例的执行计划分析而已。
参考资料:
作者:
出处:
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.
Part.2
oralce查询字段中包含非中文字符的记录?
0悬赏园豆:5[已解决问题]浏览:565次
如题,比如只有一个name列的表t1,数据如下:
name
张三2
李四
王五*
要查出‘张三2’,‘王五*’两条记录,他们都包含非中文字符。
提问于:2015-01-2416:02
问题补充:
更新
-----------------------------------------------------------------
尝试过使用正则表达式:
selectcustomernamefromtransactionrecordwhereregexp_like(customername,'[^\u4e00-\u9fa5]')
但是在oralce中测试无效。可能是由于字符集不同导致的不能工作?
参考:
收获园豆:5
16:13
感谢你的回答!
这篇文章已经参考过,但是没有找到解决方案,这篇文章是说,判断是否包含【中文字符】,而不是是否包含【非中文】字符。
16:25
@yanwushu:Oracle的SQL中的正则表达式不支持\u,要用unistr,参考Searching
UnicodecharactersinOracletable
16:39
@yanwushu:也就是:
selectcustomername
fromtransactionrecord
whereregexp_like(customername,'[^'||unistr('\4e00')||'-'||unistr('\9fa5')||']')
16:44
@dudu:感谢你的回答!
问题已经解决,sql如下:
selectcustomernamefromtransactionrecord
whereregexp_like(customername,'[^'||unistr('\4e00')||'-'||unistr('\9fa5')||']');
16:49
相关文章推荐
- 查看Oracle表空间大小
- ORACLE学习笔记 索引和约束
- oracle 删除EM
- ORACLE 11G EM 配置命令及问题处理
- Oracle用户,权限,角色以及登录管理【不错小结】
- oracle调用JAVA类的方法
- oracle 和 MySQL 的区别
- (转)Oracle一列的多行数据拼成一行显示字符
- Oracle中,用一条Sql实现任意的行转列拼接(不是decode)
- 关于oracle中的wmsys.wm_concat中的使用问题
- oracle数据类型和对应的java类型
- mysql的replace into类似于oracle的merge sql语句
- 【转】Oracle数据库中commit和rollback命令
- oracle提示TNS:无监听程序的解决办法
- Oracle 硬解析查询
- 设置Oracle 12C OEM 端口
- oracle 增加字段
- oracle共享服务器模式
- oracle建立数据库连接
- oracle 动静态参数