`

oracle判断中文

 
阅读更多

 

转自:http://blog.csdn.net/ATGC/article/details/2036799 

ORACLE写一函数,准确地判断字段是否含有汉字或者提取汉字等

从表里提取汉字, 需要考虑字符集, 不同的字符集汉字的编码有所不同
这里以GB2312为例, 写一函数准确地从表里提取简体汉字.

假设数据库字符集编码是GB2312, 环境变量(注册表或其它)的字符集也是GB2312编码
并且保存到表里的汉字也都是GB2312编码的

那么也就是汉字是双字节的,且简体汉字的编码范围是
B0A1 - F7FE
换算成10进制就是
B0  A1    F7  FE
176,161 - 247,254

我们先看一下asciistr函数的定义
Non-ASCII characters are converted to the form /xxxx, where xxxx represents a UTF-16 code unit.
但是这并不表示以 "/" 开始的字符就是汉字了

举例如下
SQL> select * from test;

NAME
--------------------
,啊OO10哈
你好aa
大家好aa/
☆大海123
★ABC

这里第5条记录有一个实心的五角星
然后用asciistr函数转换一下试试
SQL> select name,asciistr(name) from test;

NAME                 ASCIISTR(NAME)
-------------------- ----------------------
,啊OO10哈            ,/554AOO10/54C8
你好aa               /4F60/597Daa
大家好aa/            /5927/5BB6/597Daa/
☆大海123            /2606/5927/6D77123
★ABC                /2605ABC

我们看到最后一条记录的实心五角星也是 "/"开头的
此时我们就不能用asciistr(字段)是否存在 "/" 来判断是否含有汉字了.

我的函数如下,基本思路是判断字符的编码是否在GB2312规定的汉字编码范围之内

create or replace function get_chinese(p_name in varchar2) return varchar2 as   v_code     varchar2(30000) := '';   v_chinese  varchar2(4000)  := '';   v_comma    pls_integer;   v_code_q   pls_integer;   v_code_w   pls_integer; begin   if p_name is not null then      select replace(substrb(dump(p_name,1010),instrb(dump(p_name,1010),'ZHS16GBK:')),'ZHS16GBK: ',''into v_code from dual where rownum=1;      for i in 1..length(p_nameloop          if lengthb(substr(p_name,i,1))=2 then             v_comma  := instrb(v_code,',');             v_code_q := to_number(substrb(v_code,1,v_comma-1));             v_code_w := to_number(substrb(v_code,v_comma+1,abs(instrb(v_code,',',1,2)-v_comma-1)));             if v_code_q>=176 and v_code_q<=247 and v_code_w>=161 and v_code_w<=254 then                v_chinese := v_chinese||substr(p_name,i,1);             end if;             v_code := ltrim(v_code,'1234567890');             v_code := ltrim(v_code,',');          end if;          v_code := ltrim(v_code,'1234567890');          v_code := ltrim(v_code,',');      end loop;      return v_chinese;   else      return '';   end if; end; /
好,现在来执行一些语句
SQL> select * from test;

NAME
--------------------
,啊OO10哈
你好aa
大家好aa/
☆大海123
★ABC

5 rows selected.

1. 列出有汉字的记录
SQL> select name from test where length(get_chinese(name))>0;

NAME
--------------------
,啊OO10哈
你好aa
大家好aa/
☆大海123

4 rows selected.

2. 列出有汉字的记录,并且只列出汉字

SQL> select get_chinese(name) from test where length(get_chinese(name))>0;

GET_CHINESE(NAME)
---------------------------------------------------------------------------
啊哈
你好
大家好
大海

4 rows selected.


需要说明的是GB2312共有6763个汉字,即72*94-5=6763
我这里是计算72*94,没有减去那5个,那五个是空的。等查到了再减去
============

改写这个函数,可以提取非汉字或者汉字
该函数有两个参数,第一个表示要提取的字符串,第二个是1,表示提取汉字,是非1,表示提取非汉字

create or replace function get_chinese (   p_name    in varchar2,   p_chinese in varchar2 ) return varchar2 as   v_code         varchar2(30000) := '';   v_chinese      varchar2(4000)  := '';   v_non_chinese  varchar2(4000)  := '';   v_comma        pls_integer;   v_code_q       pls_integer;   v_code_w       pls_integer; begin   if p_name is not null then   select replace(substrb(dump(p_name,1010),instrb(dump(p_name,1010),'ZHS16GBK:')),'ZHS16GBK: ',''into v_code from dual where rownum=1;   for i in 1..length(p_nameloop       if lengthb(substr(p_name,i,1))=2 then          v_comma  := instrb(v_code,',');          v_code_q := to_number(substrb(v_code,1,v_comma-1));          v_code_w := to_number(substrb(v_code,v_comma+1,abs(instrb(v_code,',',1,2)-v_comma-1)));          if v_code_q>=176 and v_code_q<=247 and v_code_w>=161 and v_code_w<=254 then             v_chinese := v_chinese||substr(p_name,i,1);          else             v_non_chinese := v_non_chinese||substr(p_name,i,1);          end if;          v_code := ltrim(v_code,'1234567890');          v_code := ltrim(v_code,',');       else          v_non_chinese := v_non_chinese||substr(p_name,i,1);             end if;       v_code := ltrim(v_code,'1234567890');       v_code := ltrim(v_code,',');   end loop;   if p_chinese '1' then      return v_chinese;   else      return v_non_chinese;   end if;   else      return '';   end if; end; /
SQL> select * from a;

NAME
--------------------
我们啊、
他(艾呀)是★们
他的/啊@

SQL> select get_chinese(name,1) from a;

GET_CHINESE(NAME,1)
-----------------------------------------
我们啊
他艾呀是们
他的啊

SQL> select get_chinese(name,0) from a;

GET_CHINESE(NAME,0)
-----------------------------------------

()★
/@

 

分享到:
评论

相关推荐

    oracle中如何判断一个字符串是否含有汉字.pdf

    oracle中如何判断一个字符串是否含有汉字.pdforacle中如何判断一个字符串是否含有汉字.pdforacle中如何判断一个字符串是否含有汉字.pdf

    Oracle中强大的中文处理

    有着强大的中文处理作用,既方便,又快捷,轻松的省去原来重新新建一个数据库的方法。

    ORACLE正则表达式

    ORACLE 正则表达式的使用(REGEXP_LIKE REGEXP_INSTR REGEXP_SUBSTR REGEXP_REPLACE)

    Oracle中如何用SQL检测字段是否包括中文字符

    有一个同事的数据迁移程序有个问题,没有考虑中文编码字符,由于迁移的表有几千万数据,但是有中文的记录集很少,问我能否找出有中文内容的记录数。首先我想到的是采用检测每个字节ASCII的方式,这样的话需要写一个...

    Oracle字符相似度函数

    Oracle字符相似度函数。在sql语句中直接用该函数来计算2个字符串相似度。

    Oracle判断指定列是否全部为数字的sql语句

    代码如下: select nvl2(translate(name,’\1234567890 ‘, ‘\... 您可能感兴趣的文章:oracle 重置序列从指定数字开始的方法详解ORACLE数据库中怎么求除数字、字母之外的非中文字符的正则表达式Oracle中判断字段是否为

    Oracle正则表达式

    搞开发的人不会数据库是很难让自己提高的!尤其是Oracle是目前最流行的一种数据库语言,要想让你的开发更加顺畅,请在学好基本语法的基础上来学习正则表达式,会让你更学这门语言!

    字符串(汉字)长度判断

    * 根据Unicode编码完美的判断中文汉字和符号 * @param c 要判断的 字符 * @return boolean */ private static boolean isChinese(char c) { Character.UnicodeBlock ub = Character.UnicodeBlock.of(c); ...

    oracle使用instr或like方法判断是否包含字符串

    使用contains谓词有个条件,那就是列要建立索引,本节主要介绍了oracle使用instr或like方法判断是否包含字符串,需要的朋友可以参考下

    解决python通过cx_Oracle模块连接Oracle乱码的问题

    今天小编就为大家分享一篇解决python通过cx_Oracle模块连接Oracle乱码的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    oracle求字符串长度函数length()和hengthb()简介

    如可以用length(‘string’)=lengthb(‘string’)判断字符串是否含有中文。 注: 一个汉字在Oracle数据库里占多少字节跟数据库的字符集有关,UTF8时,长度为三。 select lengthb(‘飘’) from dual 可查询汉字...

    oracle数据库经典题目

    限定返回的行的判断条件 D. 对结果集进行排序 8. 下列哪个函数可以把一个列中的所有值相加求和? ( B ) A MAX B. SUM C. COUNT D. AVG 9. 下列哪个子句是SELECT语句中必选项?( A ) A. FROM B.WHERE C.HAVING D. ...

    汉字,繁体字查询mysql和sql server数据库

    汉字,繁体字查询mysql和sql server数据库汉字,繁体字查询mysql和sql server数据库汉字,繁体字查询mysql和sql server数据库汉字,繁体字查询mysql和sql server数据库

    plsql中文版

    在普通SQL语句的使用上增加了编程语言的特点,所以PL/SQL把数据操作和查询语句组织在PL/SQL代码的过程性单元中,通过逻辑判断、循环等操作实现复杂的功能或者计算。PL/SQL 只有 Oracle 数据库有。 MySQL 目前不支持 ...

    供应彩信二次开发接口,彩信开发平台,研发各种软件功能

    6.应用系统可通过读取MSG_Sentbox和MSG_Failedbox表中的信息来判断彩信/短信发送是否成功 接收彩信过程 1.手机用户向GPRS彩信设备发送了一条彩信 2.彩信系统将收到的“彩信通知“保存到MSG_Inbox中,并控制GPRS...

    plsqldev711免安装版

    PL/SQL Developer是一个集成开发环境,专门开发...在普通SQL语句的使用上增加了编程语言的特点,所以PL/SQL把数据操作和查询语句组织在PL/SQL代码的过程性单元中,通过逻辑判断、循环等操作实现复杂的功能或者计算。

    instantclient_12_2_x64 64位下载

    PLSQL 连接不上64位Oracle 的解决方法 系统变量中添加2个环境变量: ...如果不设置成以下值,那么连接上数据库后,你看到的所有中文的内容将会是乱码,都是一堆问号。 NLS_LANG 值:SIMPLIFIED CHINESE_CHINA.ZHS16GBK

    SuperSQL注入.rar

    目前支持Bool型盲注、错误显示注入、Union注入,支持Access、MySQL5以上版本、SQLServer、Oracle等数据库。 1.支持任意地点出现的任意SQL注入 2.支持各种语言环境。大多数注入工具在盲注下,无法获取中文等多字节...

    超级SQL注入工具,支持布尔盲注,报错盲注,union注入等

    超级SQL注入工具目前支持Bool型盲注、错误显示注入、Union注入,支持Access、MySQL5以上版本、SQLServer、Oracle等数据库。 超级SQL注入工具采用C#开发,底层采用Socket发包进行HTTP交互,极大的提升了发包效率,...

    二十一道面试程序.txt

    但是要保证汉字不被截半个,如"我ABC"4,应该截为"我AB",输入"我ABC汉DEF",6,应该输出为"我ABC"而不是"我ABC+汉的半个"。 12.Java编程,打印昨天的当前时刻 13.文件读写,实现一个计数器; 14.用java代码实现冒泡...

Global site tag (gtag.js) - Google Analytics