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语句。