`

oracle 判断字段中的中文的方法

阅读更多

判断字段中的中文的方法,与oracle的字符集有关,
AL32UTF8字符集下:中文length() 的结果为3,ascii()的结果为8位,asciistr()可以判断
eg:
select * from v$nls_parameters where parameter = 'NLS_CHARACTERSET';
1 NLS_CHARACTERSET AL32UTF8
select length('靠') from dual;
1 1
select lengthb('靠') from dual;
1 3
select asciistr('/\)(-=!@#$%^&*~中文字符') from dual;
1 /\)(-=!@#$%^&*~\4E2D\6587\5B57\7B26
select asciistr('\') from dual;
1 \
select ascii('哦') from dual;
1 15045542
ZHS16GBK字符集下:
select * from v$nls_parameters where parameter = 'NLS_CHARACTERSET';
1 NLS_CHARACTERSET ZHS16GBK
select length('靠') from dual;
1 1
select lengthb('靠') from dual;
1 2
select asciistr('/\)(-=!@#$%^&*~中文字符') from dual;
1 /\)(-=!@#$%^&*~\4E2D\6587\5B57\7B26
select instr(asciistr('/)(-=!@#$%^&*~★ABC'),'\') from dual;
1 15
select asciistr('\') from dual;
1 \
select ascii('哦') from dual;
1 50614

可以自定义函数来实现一个对字段值中是否包含有中文的判断(如邮件地址验证等)

select instr(asciistr('/\)(-=!@#$%^&*~中文字符'),'\') from dual;
如果instr的结果大于0,则包含中文或者一些特殊字符,为0则不含中文。
(但是没有能够排除掉'\'的干扰,不能区别汉字和特殊字符)


比较好的方法(摘抄):

从表里提取汉字, 需要考虑字符集, 不同的字符集汉字的编码有所不同
这里以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)
-----------------------------------------

()★
\@

SQL>

分享到:
评论

相关推荐

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

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

    Oracle中强大的中文处理

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

    oracle非数字合计,将字段中含有汉子的数据自动转换为 数字0

    根据提供的文件信息,本文将详细介绍如何实现“oracle非数字合计”,即将字段中含有汉字或其他非数字字符的数据自动转换为数字0的过程。 ### 一、问题背景 在实际工作中,可能会遇到这样的情况:某个字段中本应...

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

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

    oracle提取汉字拼音和首字母

    在Oracle数据库环境中,有时我们需要对汉字进行处理,例如获取汉字的拼音或首字母,这在中文数据检索、排序或建立索引时非常有用。本文将详细介绍如何使用PL/SQL存储过程来实现这一功能。 首先,我们需要理解Oracle...

    oracle财务数字转换中文

    这个过程在财务系统中非常常见,尤其是在中国等使用汉字的国家和地区,因为正式的财务文档通常需要将数值金额转换为中文大写形式以避免篡改。 ### Oracle财务数字转换中文 在Oracle数据库中,实现数字到中文大写...

    oracle批量修改汉字转拼音首字母的函数

    在Oracle数据库环境中,批量修改汉字转拼音首字母的需求常常出现在数据处理、索引优化或特定查询场景中。这里我们将深入探讨如何实现这个功能,并提供相关的函数和方法。 首先,我们需要理解汉字转拼音首字母的基本...

    Statement Tracer for Oracle,oracle代码跟踪工具

    Oracle数据库是全球广泛使用的数据库管理系统,它在企业级应用中占据着重要地位。在开发、维护或优化Oracle数据库系统时,理解代码执行的过程是至关重要的。"Statement Tracer for Oracle"是一个专门针对Oracle...

    Oracle字符相似度函数

    在Oracle中,SIMILARITY()通常用于CLOB类型的字段,比较两个文本字符串的相似度。它的返回值范围在0到1之间,1表示完全相同,0表示完全不同。 2. **UTL_MATCH包**: - **JARO_WINKLER()**:此函数基于Jaro距离算法...

    sql中判断某列是否为数字.docx

    在 Oracle 中判断某列是否为数字是我们平常开发中可能会遇到的问题。 Oracle 并没有提供一个现成的函数来判断某一列是否全部由数字组成。因此,我们需要通过其他方法来实现这个功能。 方法一:使用 TRIM 和 ...

    oracle 数据库性能调优技术 2 中文

    2. **过滤**: 对当前记录进行检查,判断`c1`字段的值是否等于2。如果不满足条件,则跳回步骤1继续处理下一条记录。如果满足条件,则进入下一步。 3. **结果集处理**: 将当前记录加入结果集,并再次回到步骤1处理下...

    Oracle截取字符串去掉字段末尾指定长度的字符

    在Oracle数据库中,处理字符串是常见的操作之一,特别是在数据清洗、数据分析或报表生成等场景。本文将详细讨论如何使用Oracle的内置函数来截取并处理字符串,特别是如何去掉字段末尾指定长度的字符。 首先,Oracle...

    oracle case语句的介绍

    在 Oracle 数据库中,CASE 语句是一种非常实用且灵活的条件判断表达式,它可以用于根据不同的条件返回不同的值。CASE 语句可以分为两种类型:简单 CASE 语句和搜索 CASE 语句。 - **简单 CASE 语句**(Simple CASE ...

    Oracle认证Java SE 8程序员考纲(中文版)

    - **静态方法与字段**:学习如何使用`static`关键字定义静态成员。 - **构造函数**:掌握默认构造函数的行为以及如何自定义构造函数。 - **访问修饰符**:理解public、private、protected和default的不同作用范围。 ...

    oracle常用总结

    判断字段值全由数字组成,可以比较字段长度与长度在字节(bytes)级别的长度是否相等。`length(字段)=lengthb(字段)`,因为纯数字字符串的长度和字节长度一致。 3. **查询字符串中是否有换行和回车**: 在SQL中,...

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

    在处理中文字符时,需要注意的是,一个汉字在Oracle数据库中占据的字节数取决于数据库使用的字符集。例如,如果数据库采用GBK字符集,一个汉字通常占用2字节;而在UTF-8字符集中,一个汉字通常占用3字节。因此,当你...

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

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

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

    在Python编程中,当使用cx_Oracle模块连接到Oracle数据库时,可能会遇到中文乱码的问题。这通常是由于字符集设置不匹配导致的。本文将详细解释这个问题,并提供解决方案。 首先,Oracle数据库支持多种字符集,用于...

Global site tag (gtag.js) - Google Analytics