zoukankan      html  css  js  c++  java
  • 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编码表。

    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()转换后,其结果是05C,也是带有的,所以对于这个字符要特别注意下。所以,这种方法的思路就是可以先 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语句。
  • 相关阅读:
    DS博客作业02--线性表
    DS博客作业01--日期抽象数据类型设计与实现
    C语言博客作业06--结构体&文件
    C语言博客作业05--指针
    C语言博客作业04--数组
    DS博客作业8——课程总结
    DS博客作业07——查找
    DS博客作业06--图
    DS博客作业——树
    DS博客作业03--栈和队列
  • 原文地址:https://www.cnblogs.com/bolang100/p/6169046.html
Copyright © 2011-2022 走看看