oracle 字符处理
oracle获取字符串长度函数length()和hengthb()
lengthb(string)计算string所占的字节长度:返回字符串的长度,单位是字节
length(string)计算string所占的字符长度:返回字符串的长度,单位是字符
对于单字节字符,LENGTHB和LENGTH是一样的.
如可以用length(‘string’)=lengthb(‘string’)判断字符串是否含有中文。
注:
一个汉字在Oracle数据库里占多少字节跟数据库的字符集有关,UTF8时,长度为三。
select length('cctv') from dual ;可查询汉字在Oracle数据库里占多少字节。
select length('中冶华天马') cd,length2('中冶华天马') cd2,length4('中冶华天马') cd3,lengthb('中冶华天马') b,lengthc('中冶华天马') c from dual;
length()=length2()=length4()=lengthc()<lengthb()
使用ASCII码来区分中文和其它字符,中文的ASCII码值的范围是45217~63486,根据这个来实现,我们就需要使用Oracle中的函数ASCII,用它来返回ASCII值。
这种方式可以完美区分中文字符和其它字符。
create or replace function getCustText(custName varchar2) return varchar2 is
Result varchar2(100);
tmp_custName varchar2(100);
count_str number;
i number:=1;
str_ascii number;
current_char varchar2(10);
begin
select length(custName) into count_str from dual;
while i<count_str loop
current_char:=substr(custName,i,1);
select ASCII(current_char) into str_ascii from dual;
if str_ascii>45216 then
tmp_custName:=tmp_custName||current_char;
end if;
i:=i+1;
end loop;
Result:=tmp_custName;
return(Result);
end getCustText;
在oracle数据库中 有很多的转换函数,主要有chr()、ascii()、asciistr()、cast()、chartorowid()、convert()、 rowidtochar()、to_char()、to_date()、to_number()等,其中to_char()、to_date()、 to_number()是最常见也是最常用的,chr()一般常出现在控制字符串输出的时候。本文主要总结chr()、ascii()、 asciistr()、convert()这四个转换函数:
1、chr()
chr()函数是将ASCII码转换为字符:ASCII码 -> 字符,ASCII码对应的字符可以参见本文后面的ASCII编码表。
图1:chr()示例
2、ascii()
ascii()函数是chr()的反函数,它表示将字符转换为ASCII码:字符 -> ASCII码。
图2:ascii()示例
3、asciistr()
asciistr()函数是将字符串转换为ascii字符串,如下图3:
图3:asciistr()示例
关于asciistr()函数,我在网上看到一篇文章说可以用asciistr()函数来判断一个字符串中是否含有中文字符,我看了其思路,挺有参考价值的,大概是这样的:
图4:用asciistr()函数判断一个字符串中是否含有中文字符
根
据上图4可以看出,如果是中文字符,那么用asciistr()转换以后,其形式是\4E2D这样的,前面有斜杠\,但是并不是所有带有\都是中文字符,
因为斜杠\本身用asciistr()转换后,其结果是\005C,也是带有\的,所以对于这个字符要特别注意下。所以,这种方法的思路就是可以先
replace掉字符串中的斜杠\,然后再用asciistr()转换,然后判断转换后的字符串中是否有斜杠\,如果有则表示存在中文字符。如果再加上循
环统计的代码,还可以用于统计出一共有多少个中文字符。
4、convert()
convert()
函数的转换是用于将字符串从一个字符集转化为另一个字符集,函数形式:convert(char, dest_char_set [,
source_char_set]),其中char表示要转换的字符串,dest_char_set表示要转换成的目的字符
集,source_char_set是char的原本字符集,如果缺省,则默认是数据库的字符集。
图5:convert()示例
有关convert()的转换思路,跟convert()相关的一些知识,可以参见博客中《收藏的一段oracle数据库中blob类型按指定编码转换为blob、clob、字符串类型的代码》这篇博文。
ORACLE获取字符串中数字部分
select translate('1212中国2323','0123456789'||'1212中国2323','0123456789') from dual;
select regexp_replace('23456中国3-00=.,45','[^0-9]') from dual;
标签:regexp_replace regexp replace oracle 正则
函数的参数说明:
一共6个参数,分别是
1、待匹配的字符串
2、正则表达式
3、替换的字符
4、标识从第几个字符开始正则表达式匹配。(默认为1)
5、标识第几个匹配组。(默认为全部都替换掉)
6、取值范围:
i:大小写不敏感;
c:大小写敏感;(默认)
n:不匹配换行符号;
m:多行模式;
x:扩展模式,忽略正则表达式中的空白字符。


可以通过REGEXP_SUBSTR函数(配合正则表达式)来实现。
举例:
sql:select regexp_substr('CYJ8-ABC','[0-9]+') from dual; 以上sql执行结果:8;
备注:
REGEXP_SUBSTR函数格式如下:
function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)
__srcstr :需要进行正则处理的字符串
__pattern :进行匹配的正则表达式
__position :起始位置,从第几个字符开始正则表达式匹配(默认为1)
__occurrence :标识第几个匹配组,默认为1
__modifier :模式('i'不区分大小写进行检索;'c'区分大小写进行检索。默认为'c'。)


select
( ((translate('T123','0123456789',' ')))) "字符",
( (translate('T34T56T','abc...zABCT...Z',' '))) "数字"
from dual; 一、语法:
TRANSLATE(string,from_str,to_str) 二、目的
返回将(所有出现的)from_str中的每个字符替换为to_str中的相应字符以后的string。TRANSLATE 是 REPLACE 所提供的功能的一个超集。如果 from_str 比 to_str 长,那么在 from_str 中而不在 to_str 中的额外字符将从 string 中被删除,因为它们没有相应的替换字符。to_str 不能为空。Oracle 将空字符串解释为 NULL,并且如果TRANSLATE 中的任何参数为NULL,那么结果也是 NULL。 三、允许使用的位置
过程性语句和SQL语句。
oracle 字符处理的更多相关文章
- oracle 字符乱码问题解决方案
今天在客户服务器上遇到了oracle中文乱码问题,第一个想到的是:要想避免oracle字符乱码的问题,需要注意oracle客户端的字符编码和服务端的字符编码保持一致. 于是操作如下: 1.查看服务端字 ...
- Oracle字符乱码、数据越界訪问典型Bug分析
Oracle字符乱码.数据越界訪问典型Bug分析 前言: 作为乙方,在甲方客户那里验收阶段发现两个诡异Bug. 下面就问题来源.问题根因.解决方式.怎样避免做具体描写叙述. .且两 ...
- Oracle字符函数(转换大小写,替换等)
在oracle中,有一些字符函数: upper(字符串):转换为大写lower(字符串):转换为小写initcap(字符串):首字母大写replace(字符串1,字符串2,字符串3):将串1中所有的串 ...
- Oracle(字符函数)
单行函数语法: 语法:funcation_name(列 | 表达式[, 参数1, 参数2]) 单行函数主要分为以下几种: 字符函数:接收数据返回具体的字符信息 数值函数:对数字进行处理,例如:四舍五入 ...
- Oracle字符编码与汉字存储长度的处理
执行如下语句,查看汉字在数据库中所占的字节: select vsize('汉') from dual; 一般情况下,得到的结果大部分为值:2 或 3 一般linux下安装oracle数据库,默认字符编 ...
- oracle字符乱码的解决方法
原因分析: 客户端字符集就是为了让数据库知道我们传递过去的字符是属于哪种字符集,以便于Oracle在存储字符时进行相应的编码映射(查看客户端字符集通过查找注册表中的NLS_LANG键).在客户端查询数 ...
- 字符类数据类型和oracle字符类型的区别
为兼容Oracle的数据类型,KingbaseES扩展了Oracle的NUMBER.VARCHAR2.CHAR(n)和DATE类型.该措施使得移植Oracle的Create Table等DDL语句时, ...
- Oracle字符分隔函数(split)
为了让 PL/SQL 函数返回数据的多个行,必须通过返回一个 REF CURSOR 或一个数据集合来完成.REF CURSOR 的这种情况局限于可以从查询中选择的数据,而整个集合在可以返回前,必须进行 ...
- oracle字符函数
UPPER(char) 小写转大写 LOWER(char) 大写转小写 INITCAP(char) 首字母转换 SUBSTR(char,[m[,n]]) 截取字符串函数 从源字符串char的m开始截取 ...
随机推荐
- SpringCloud统一配置之使用配置
配置的读取方式在上一篇文章中有提到. 取到值之后赋值给静态类里的静态变量. 因为SpringCloud项目启动的时候会把所有的api都执行一遍(相当蛋疼),所以这里直接就可以写一个方法进行赋值. 代码 ...
- bzoj 2516: 电梯
Description Input Output 状压dp,状态表示为表示当前在第x层,电梯内有哪些人,哪些人还没到终点 #include<cstdio> #include<cstr ...
- Date类型之组件方法
在之前总结了Date类型的继承方法和格式化方法,现在来总结一下日期时间组件方法,这些方法都是直接取得和设置日期值中特定部分的方法. var d = new Date(); //getDate() 从 ...
- POJ 3666 Making the Grade (线性dp,离散化)
Making the Grade Time Limit : 2000/1000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other) T ...
- [转]Java.APK 反编译
本文转自:http://blog.csdn.net/vipzjyno1/article/details/21039349/ (注:反编译不是让各位开发者去对一个应用破解搞重装什么的,主要目的是为了促进 ...
- 部署DNS从服务器
修改主服务器中区域信息文件: # vi /etc/named.rfc1912.zones 检查配置文件是否有错误 # named-checkconf 重启named服务程序,让配置文件生效 #syst ...
- word2vec 的理解
1.CBOW 模型 CBOW模型包括输入层.投影层.输出层.模型是根据上下文来预测当前词,由输入层到投影层的示意图如下: 这里是对输入层的4个上下文词向量求和得到的当前词向量,实际应用中,上下文窗口大 ...
- linux优化之全过程
基于开放源代码的Linux给用户提供了这样一个平台:可以根据自己的软.硬件环境,定制自己的Linux应用环境.因此,根据每个用户不同的应用范围定制应用环境,可以将Linux系统的性能提升到新的高度. ...
- Fork-Join 原理深入分析(二)
本文是将 Fork-Join 复杂且较为庞大的框架分成5个小点来分析 Fork-Join 框架的实现原理,一个个点地理解透 Fork-Join 的核心原理. 1. Frok-Join 框架的核心类 ...
- PHP笔记(配置UPUPW环境)
一,首先修改HOSTS将127.0.0.1 gzt.com加入,前面不要# 二,GZT.COM的数据库文件在--------------配置在: - 三,配置 主要修改这几个 $BASIC=arra ...