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编码表。

chr()示例

图1:chr()示例

2、ascii()

ascii()函数是chr()的反函数,它表示将字符转换为ASCII码:字符 -> ASCII码。

ascii()示例

图2:ascii()示例

3、asciistr()

asciistr()函数是将字符串转换为ascii字符串,如下图3:

asciistr()示例

图3:asciistr()示例

关于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的原本字符集,如果缺省,则默认是数据库的字符集。

convert()示例

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