- 浏览: 1057017 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
nieanan:
感谢,很有帮助。
eclipse 改变JAVA_HOME路径 -
Orange_killer:
写的什么东西,文不对题
Hibernate Search大数据量手动建立索引 -
xiaoasha:
org.eclipse.equinox.servlet.api ...
《OSGI实战》遇到的问题 -
powertech:
写的挺细,有用!
SyntaxError: Non-ASCII character Python、Unicode和中文 -
huang_yong:
public class XMLUtil {
pri ...
XStream 去除生成的XML节点的class="list"
判断字段中的中文的方法,与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>
发表评论
-
MySQL 5.1 无法启动 1067 错误解决方法
2010-07-13 23:06 2681MySQL 5.1 无法启动 1067 错误解决方法 这两天 ... -
连接VMWare上的oracle
2010-07-05 10:55 1647在vmware上面安装了一个oracle,主机却怎么也连接不 ... -
oracle-merge用法详解
2010-01-26 14:10 1120原文:http://blog.chinaunix.net/u/ ... -
数据库与数据仓库的区别
2010-01-19 12:38 1334简而言之,数据库是面向事务的设计,数据仓库是面向主题设计的。 ... -
从 char 数据类型到 datetime 数据类型的转换导致 datetime 值越界
2010-01-11 10:04 2783想要造一点随机数据,日期等于ID%30,结果却碰到了:“从 ... -
oracle 与 SQL Server 利用select 建表和update的区别
2010-01-05 14:47 2438Oracle: 建表可以使用: crea ... -
筛选数据库重复记录
2010-01-05 11:07 2742请问以下两个功能如何实现? (1)如何选出重复的 ... -
调用oracle10g 存储过程利用sys_refcursor返回结果集
2009-12-23 12:16 4948SQL> create table test 2 ... -
ORACLE中有没有判断一个字符串是否可以转换成数字的函数
2009-12-23 09:56 3901Org: http://topic.csdn.net/t/20 ... -
ORACLE存储过程update不成功的另一个原因
2009-12-11 10:45 5326今天,一个存储过程遇到了一个奇怪的问题,没有任何的出错信息,但 ... -
oracle存储过程调用
2009-12-02 15:24 2738今天写了一个存储过程,发现PL/SQL里面这个存储过程图标上老 ... -
聚族索引、非聚族索引、组合索引的含义和用途
2009-11-26 10:48 2384一、什么是索引 索引可以理解为我们小时候使用 的汉语字典的 ... -
mssql附加数据库后出现“对象名XXXX无效”
2009-11-19 16:48 5432mssql数据库服务器进行硬件升级后,采用附加数据库的方式还原 ... -
换种方法,提高left join查询的效率
2009-09-28 15:11 4589表之间使用联结查询时,以left join为例,当联结的表较多 ... -
char,varchar,nvarchar有什么区别
2009-09-25 13:08 1432一 、 nchar 和 nvarc ... -
Oracle索引与where
2009-09-24 12:24 1370一个ORACLE查询中,有N多的查询条件,要把:一次可以缩小范 ... -
大数据量分页存储过程效率测试附代码
2009-09-24 11:17 1628原文地址:http://www.cnblogs.com/Jos ... -
SQLServer 实现rownum 的功能
2009-09-10 10:39 7974方法1: with temp as ( sel ... -
ORACLE中用rownum分页并排序的SQL语句
2009-09-10 10:37 1648以前分页习惯用这样的SQL语句: select * ... -
Oracle触发器介绍
2009-09-07 09:25 1470语句级触发器我们先看 ...
相关推荐
有一个同事的数据迁移程序有个问题,没有考虑中文编码字符,由于迁移的表有几千万数据,但是有中文的记录集很少,问我能否找出有中文内容的记录数。首先我想到的是采用检测每个字节ASCII的方式,这样的话需要写一个...
有着强大的中文处理作用,既方便,又快捷,轻松的省去原来重新新建一个数据库的方法。
根据提供的文件信息,本文将详细介绍如何实现“oracle非数字合计”,即将字段中含有汉字或其他非数字字符的数据自动转换为数字0的过程。 ### 一、问题背景 在实际工作中,可能会遇到这样的情况:某个字段中本应...
代码如下: select nvl2(translate(name,’\1234567890 ‘, ‘\... 您可能感兴趣的文章:oracle 重置序列从指定数字开始的方法详解ORACLE数据库中怎么求除数字、字母之外的非中文字符的正则表达式Oracle中判断字段是否为
在Oracle数据库环境中,有时我们需要对汉字进行处理,例如获取汉字的拼音或首字母,这在中文数据检索、排序或建立索引时非常有用。本文将详细介绍如何使用PL/SQL存储过程来实现这一功能。 首先,我们需要理解Oracle...
这个过程在财务系统中非常常见,尤其是在中国等使用汉字的国家和地区,因为正式的财务文档通常需要将数值金额转换为中文大写形式以避免篡改。 ### Oracle财务数字转换中文 在Oracle数据库中,实现数字到中文大写...
在Oracle数据库环境中,批量修改汉字转拼音首字母的需求常常出现在数据处理、索引优化或特定查询场景中。这里我们将深入探讨如何实现这个功能,并提供相关的函数和方法。 首先,我们需要理解汉字转拼音首字母的基本...
Oracle数据库是全球广泛使用的数据库管理系统,它在企业级应用中占据着重要地位。在开发、维护或优化Oracle数据库系统时,理解代码执行的过程是至关重要的。"Statement Tracer for Oracle"是一个专门针对Oracle...
在Oracle中,SIMILARITY()通常用于CLOB类型的字段,比较两个文本字符串的相似度。它的返回值范围在0到1之间,1表示完全相同,0表示完全不同。 2. **UTL_MATCH包**: - **JARO_WINKLER()**:此函数基于Jaro距离算法...
在 Oracle 中判断某列是否为数字是我们平常开发中可能会遇到的问题。 Oracle 并没有提供一个现成的函数来判断某一列是否全部由数字组成。因此,我们需要通过其他方法来实现这个功能。 方法一:使用 TRIM 和 ...
2. **过滤**: 对当前记录进行检查,判断`c1`字段的值是否等于2。如果不满足条件,则跳回步骤1继续处理下一条记录。如果满足条件,则进入下一步。 3. **结果集处理**: 将当前记录加入结果集,并再次回到步骤1处理下...
在Oracle数据库中,处理字符串是常见的操作之一,特别是在数据清洗、数据分析或报表生成等场景。本文将详细讨论如何使用Oracle的内置函数来截取并处理字符串,特别是如何去掉字段末尾指定长度的字符。 首先,Oracle...
在 Oracle 数据库中,CASE 语句是一种非常实用且灵活的条件判断表达式,它可以用于根据不同的条件返回不同的值。CASE 语句可以分为两种类型:简单 CASE 语句和搜索 CASE 语句。 - **简单 CASE 语句**(Simple CASE ...
- **静态方法与字段**:学习如何使用`static`关键字定义静态成员。 - **构造函数**:掌握默认构造函数的行为以及如何自定义构造函数。 - **访问修饰符**:理解public、private、protected和default的不同作用范围。 ...
判断字段值全由数字组成,可以比较字段长度与长度在字节(bytes)级别的长度是否相等。`length(字段)=lengthb(字段)`,因为纯数字字符串的长度和字节长度一致。 3. **查询字符串中是否有换行和回车**: 在SQL中,...
在处理中文字符时,需要注意的是,一个汉字在Oracle数据库中占据的字节数取决于数据库使用的字符集。例如,如果数据库采用GBK字符集,一个汉字通常占用2字节;而在UTF-8字符集中,一个汉字通常占用3字节。因此,当你...
汉字,繁体字查询mysql和sql server数据库汉字,繁体字查询mysql和sql server数据库汉字,繁体字查询mysql和sql server数据库汉字,繁体字查询mysql和sql server数据库
在Python编程中,当使用cx_Oracle模块连接到Oracle数据库时,可能会遇到中文乱码的问题。这通常是由于字符集设置不匹配导致的。本文将详细解释这个问题,并提供解决方案。 首先,Oracle数据库支持多种字符集,用于...