从表里提取汉字, 需要考虑字符集, 不同的字符集汉字的编码有所不同
这里以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_name) loop
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_name) loop
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数据库环境中,有时我们需要对汉字进行处理,例如获取汉字的拼音或首字母,这在中文数据检索、排序或建立索引时非常有用。本文将详细介绍如何使用PL/SQL存储过程来实现这一功能。 首先,我们需要理解Oracle...
在Oracle数据库中实现获取汉字拼音首字母的需求,通常涉及到对中文字符的处理以及拼音转换的技术。这样的功能可以应用于多种场景,例如数据排序、索引建立或是快速检索等。本文将详细介绍如何在Oracle环境中实现这一...
有着强大的中文处理作用,既方便,又快捷,轻松的省去原来重新新建一个数据库的方法。
### Oracle 汉字拼音简码获取:深入解析与应用 在现代信息技术中,文本处理尤其是多语言文本处理,已经成为数据库管理和应用开发中的关键环节。其中,将汉字转换为其拼音简码(即取每个汉字拼音的首字母)是常见的...
ORACLE 正则表达式的使用(REGEXP_LIKE REGEXP_INSTR REGEXP_SUBSTR REGEXP_REPLACE)
此函数根据汉字的Unicode范围,判断其是否为多音字,并相应地处理拼音首字母。在实际应用中,可能需要进一步优化以处理特殊情况,例如多音字和没有对应拼音的生僻字。 为了批量修改数据,你可以创建一个更新语句,...
有一个同事的数据迁移程序有个问题,没有考虑中文编码字符,由于迁移的表有几千万数据,但是有中文的记录集很少,问我能否找出有中文内容的记录数。首先我想到的是采用检测每个字节ASCII的方式,这样的话需要写一个...
Oracle姓名中文转全拼函数是解决在Oracle数据库中处理中文姓名时的一个常见需求,特别是考虑到汉字的多样性和复杂性,包括生僻字和多音字的处理。此函数旨在将中文姓名转换为全拼,方便进一步的数据处理或搜索。下面...
### Oracle数字转换为中文大写的实现 #### 核心概念与背景 在财务模块的开发中,将数字转换成中文大写是必需的功能之一,尤其是在中国以及使用中文的地区。例如,在开具发票、合同等正式文档时,通常需要将金额...
在Oracle数据库环境中,有时我们需要对汉字进行处理,例如获取汉字的拼音或者拼音首字母,这在数据处理、搜索优化或特定应用开发中非常有用。Oracle提供了多种方式来实现这一功能,通常通过编写自定义的PL/SQL函数来...
Oracle字符相似度函数是Oracle数据库系统提供的一种功能,用于评估两个字符串之间的相似性。这个功能在数据清洗、信息检索、文本分析等领域具有广泛的应用。在SQL查询中,我们可以直接使用这些函数来比较不同字符串...
在Oracle数据库中,同音字查询是一个特殊的需求,通常用于处理中文字符的相似性匹配,例如用户输入可能存在拼写错误或者使用了同音字。Oracle提供了多种方式来实现这一功能,下面将详细介绍如何在Oracle中进行同音字...
代码如下: select nvl2(translate(name,’\1234567890 ‘, ‘\... 您可能感兴趣的文章:oracle 重置序列从指定数字开始的方法详解ORACLE数据库中怎么求除数字、字母之外的非中文字符的正则表达式Oracle中判断字段是否为
在这个"Oracle函数大全中文"资源中,包含了对Oracle数据库中各种函数的详细解释,这些函数涵盖了数值型、字符型、日期型、转换、聚组以及分析等多个方面。下面我们将逐一深入探讨这些重要的知识点。 1. 数值型函数...
通过执行计划,可以理解查询的逻辑流程,判断是否需要添加索引或调整查询结构来提升性能。 3. **资源消耗统计**:Statement Tracer可以详细统计每个SQL语句的CPU时间、I/O次数、内存使用等资源消耗,这对于定位高...
这份"Oracle中文文档"集合提供了宝贵的参考资料,包括"NET开发ORACLE.pdf"和"ORACLE 九阴真经.chm"两个文件,帮助用户深入理解和掌握Oracle的相关技术。 "NET开发ORACLE.pdf"很可能是一部关于如何使用.NET框架与...
这个函数在SQL查询中用于判断一个字符串是否符合特定的正则表达式模式。它的基本语法是: ```sql SELECT column FROM table WHERE REGEXP_LIKE(column, pattern [, match_parameter]); ``` 其中,`pattern`是...
这个过程在财务系统中非常常见,尤其是在中国等使用汉字的国家和地区,因为正式的财务文档通常需要将数值金额转换为中文大写形式以避免篡改。 ### Oracle财务数字转换中文 在Oracle数据库中,实现数字到中文大写...
本文将围绕“Oracle中文电子书”这一主题,深入探讨Oracle数据库的关键知识点,尤其是书中涉及的Oracle函数及其应用。 Oracle数据库中,函数是SQL语言的重要组成部分,它们用于处理数据并返回结果。在“Oracle函数...