精华内容
下载资源
问答
  • Linux下修改oracle字符集 Linux 下修改 oracle 字符集:WE8ISO8859P1 修改为 ZHS16GBK.  WE8ISO8859P1 字符集是安装 oracle 时默认字符集,不支持中文。
  • ORACLE in (字符串,字符串,字符串)

    千次阅读 2009-03-02 11:06:00
    因为传进来的参数是 字符串,字符串,字符串,要实现in(字符串,字符串,字符串)select * from htl_price p where p.hotel_id = 30073328 and p.able_sale_date between to_date(2009-03-27,YYYY-MM-DD) and to_date...

    因为传进来的参数是 字符串,字符串,字符串,要实现in(字符串,字符串,字符串)
    select * from htl_price p where p.hotel_id = 30073328
            and p.able_sale_date between to_date('2009-03-27','YYYY-MM-DD') and to_date('2009-03-28','YYYY-MM-DD')
    and p.pay_method = 'pre_pay'
            and to_char(p.child_room_type_id) in (33153,33154);

    --目标是这样

     


    select * from htl_price p where p.hotel_id = 30073328
            and p.able_sale_date between to_date('2009-03-27','YYYY-MM-DD') and to_date('2009-03-28','YYYY-MM-DD')
    and p.pay_method = 'pre_pay'
            and to_char(p.child_room_type_id) in concat(concat('(','33153,33154'),')');

    --此法不行

     


    select * from htl_price p where p.hotel_id = 30073328
            and p.able_sale_date between to_date('2009-03-27','YYYY-MM-DD') and to_date('2009-03-28','YYYY-MM-DD')
    and p.pay_method = 'pre_pay'
            and to_char(p.child_room_type_id) in
    (select *
              from (select regexp_substr('33153,33154', '[^,]+', 1, rownum) n
                      from dual
                    connect by rownum < 50)
             where n is not null);

    --这样就可以

    connect by 把每次执行只返回一个结果组成一个结果集。

    regexp_substr('33153,33154', '[^,]+', 1, rownum):参数1是从最头那个字母开始,rownum是第几次出现。

    展开全文
  • 比如Oracle数据库中用于存储字符串类型数据的字段类型就超过了5种。遗憾的是,在日常工作中笔者发现很多开发者对这些类型并没有完整的认识,更不用说设计表结构时正确的选择字段类型了。本文将辨析Oracle数据库中...

    本文来自李明子csdn博客(http://blog.csdn.net/free1985),商业转载请联系博主获得授权,非商业转载请注明出处!

    1 引子

    字符串类型的字段在各关系数据库中均占有重要地位。比如Oracle数据库中用于存储字符串类型数据的字段类型就超过了5种。遗憾的是,在日常工作中笔者发现很多开发者对这些类型并没有完整的认识,更不用说设计表结构时正确的选择字段类型了。本文将辨析Oracle数据库中表示字符串的各字段类型以及设计表结构时字段类型的选择依据。

    2 字段类型介绍

    Oracle数据库中,用于表示字符串类型的字段类型包括CHAR、VARCHAR2、VARCHAR、NCHAR、NVARCHAR2、CLOB和NCLOB等几种,下面我们来一一介绍这些类型。
    2.1 CHAR
    CHAR类型用于存储定长的字符串,字段长度的取值范围是1到2000字节,默认为1字节。因为CHAR是定长的,所以,当存储的字符串小于设置的字段长度时,Oracle将在字符串尾填充空格占位。比如我们定义了一个字段“TEST_CHAR CHAR(2)”,而插入的记录对应字段值为“a”,则从表中读取的记录的对应字段是填充了一个空格的“a ”。
    对于CHAR类型值的比较,Oracle会在填充空格补齐到设置长度后进行。比如对于上例,当检索条件为“where TEST_CHAR=’a’”时是可以得到记录“a ”的。
    另外,在定义CHAR的长度时可以使用单位名称BYTE或CHAR,默认为BYTE。即“TEST_CHAR CHAR(2 BYTE)”意为长度为2个字节的CHAR,而“TEST_CHAR CHAR(2 CHAR)”意为长度为2个字符的CHAR。
    这里说的“字节”是存储字段信息所占用的物理存储空间,而“字符”则是指存储的信息的最小逻辑单位。当数据库使用单字节字符集时,一个字符的存储空间就是一个字节,而当数据库使用多字节字符集时,一个字符的存储空间可能是1到n个字节。
    2.2 VARCHAR2
    VARCHAR2类型用于存储变长的字符串,字段长度的取值范围是1到4000字节。VARCHAR2是变长的,这意味着实际存储长度与具体的字符串有关。
    对于VARCHAR2类型的比较,Oracle不会预先填充空格,而是直接比较值。比如我们定义一个字段“TEST_VARCHAR2 VARCHAR2(2)”,插入对应字段值为“a ”的记录。当检索条件为“where TEST_ VARCHAR2=’a’”时是无法得到记录“a ”的。
    另外,与CHAR一样,在定义VARCHAR2类型字段的最大长度时可以使用单位名称BYTE或CHAR,默认为BYTE。即“TEST_ VARCHAR2 VARCHAR2(2 BYTE)”意为最大长度为2个字节的VARCHAR2,而“TEST_ VARCHAR2 VARCHAR2 (2 CHAR)”意为长度为2个字符的VARCHAR2。
    2.3 VARCHAR
    在Oracle中,VARCHAR被定义为VARCHAR2的别名,其一切行为、特征与VARCHAR2相同。据传,起初,Oracle预留了VARCHAR字段类型用于与其他数据库兼容。而时至今日,它仍作为VARCHAR2的别名存在,其意义恐怕只是对Oracle数据库自身的向下兼容了。
    2.4 NCHAR
    NCHAR类型用于存储定长的Unicode字符串,其字符集只能是AL16UTF16或UTF8,与数据库安装时指定的字符集相同。有关Oracle数据库字符集的相关知识可参见Oracle官网在线文档Database Globalization Support Guide( https://docs.oracle.com/database/121/NLSPG/applocaledata.htm#NLSPG014)。
    在设置NCHAR类型字段的长度时,不支持设置单位名称,即单位名称均为“字符”。比如“TEST_NCHAR NCHAR(2)”指长度为2个字符的NCHAR类型字段。NCHAR字段的最大长度是2000个字节。这意味着它最多可以存储2000个字符,但这些字符的实际存储空间不能超过2000个字节。
    NCHAR的其他特性与CHAR相同,恕不赘述。
    2.5 NVARCHAR2
    NVARCHAR2类型用于存储变长的Unicode字符串,其特性参见VARCHAR2和NCHAR,恕不赘述。
    2.6 CLOB
    CLOB类型用于存储最大不超过128TB的变长字符串。CLOB支持事务,但不支持跨事务和会话的定位。下面的示例定义了一个叫做CLOB_TEST的CLOB类型的字段:CLOB_TEST CLOB。
    因为CLOB类型的字段在表中记录的是实际信息的指针,因此无法在sql语句中使用比较运算符。如果我们需要查找CLOB_TEST值为“a”的记录可以使用查询条件“where dbms_lob.compare(t.clob_test,’a’)=0”。
    2.7 NCLOB
    NCLOB类型用于存储最大不超过128TB的Unicode变长字符串。NCLOB的其他特性与CLOB相同,恕不赘述。

    3 字段类型选择依据

    既然Oracle数据库提供了多种字段类型用于字符串类型数据的存储,那么我们在设计数据库表结构时应该如何选择呢?笔者认为应该从各字段类型的区别、限制入手,抓住字符串类型数据的关键特性,从而选择出最适合的字段类型。下面将逐一介绍这些关键特性。
    3.1 最大长度
    从存储信息的角度来说,字段支持的字符串长度是信息能否被完整保留的重要条件。CHAR和NCHAR的最大长度是2000字节,VARCHAR2和NVARCHAR2的最大长度是4000字节,CLOB和NCLOB的最大长度是128TB。当我们要选择一个字段类型来存储字符串信息时,应当首先根据业务模型判断字符串的最大值,排除掉无法满足最大存储需求的字段类型。因为CLOB(NCLOB)类型使用时的诸多不便,当CHAR(NCHAR)和VARCHAR2(NVARCHAR)字段类型的最大长度限制可以满足业务需求时,通常不使用CLOB(NCLOB)类型。
    3.2 是否定长
    CHAR(NCHAR)类型与VARCHAR2(NVARCHAR2)类型最大的区别在于是否定长。CHAR(NCHAR)类型是定长的,这意味着它拥有更高的访问效率。但是,当实际存储的信息小于设置的字段长度时,Oracle会用空格来填充,此时会浪费一定的存储空间。虽然对于单条记录这个影响可以忽略不计,但对于海量记录,这个浪费就需要引起足够的重视了。
    VARCHAR2(NVARCHAR2)的情形与CHAR(NCHAR)刚好相反。它通过牺牲访问效率获得了更高的空间利用率。
    3.3 存储内容包含的字符
    NCHAR、NVARCHAR2、NCLOB类型存储Unicode字符串,仅支持AL16UTF16或UTF8字符集。虽然实际工作中很少遇到,但如果要存储的字符超出AL16UTF16和UTF8字符集范围,那就无法使用NCHAR、NVARCHAR2、NCLOB等字段类型了。
    3.4 是否需要建立索引
    如果需要为存储字符串的字段建立索引,那么我们要格外注意其对字段类型的限制。在CLOB和NCLOB类型的字段上是不能建立普通索引的。而在NCLOB类型的字段上是不能建立文本索引(如CONTEXT)的。
    3.5 是否可能出现数据库迁移
    如果可以预见在将来数据库可能发生迁移,那么设计数据库表结构时应该充分考虑字段类型的兼容性。比如,将Oracle中的NCHAR类型迁移到IBM DB2时,就需要通过CCSID子句创建兼容Unicode字符集的CHAR或VARCHAR。

    4 常见场景的字段类型选择

    第3节中从技术角度讨论了存储字符串类型数据时的选择依据,属于设计表结构时的一些指导原则。本节将以工作指导书的形式介绍在工作中经常涉及的几个业务场景中的字段类型选择及原因,帮助读者更深刻的理解各字段类型的差异。
    4.1 记录状态及可枚举值
    在数据库设计中,我们常常需要表示记录状态的字段。比如,用“R”表示记录已发布,“O”表示记录被检出;再比如用“O”表示树节点已展开,用“C”表示树节点已关闭;甚至表示布尔,用“1”表示真,用“0”表示假。
    这类场景存储的字符串具有定长(或最大长度可知)、可枚举、信息通常为英文字母或数字、经常作为检索过滤条件等特点。
    对于这类场景,我们通常使用CHAR类型字段进行存储。
    4.2 GUID、UUID与MD5
    GUID和UUID是我们经常使用的全局唯一标识符。它们具有长度、格式统一,字符可枚举(16进制数字)的特点。相应的,用于校验的MD5、SH-11、CRC等也有类似的特征。
    对于这类字符串,我们通常使用CHAR类型字段来存储。
    4.3 单据号、证件号
    业务系统中经常需要存储符合一定格式的单据号、证件号。它们除了具有定长、字符可枚举的特点外,还是一些信息的编码集合。以身份证为例,18位数字中就包含了户籍地址、出生日期、性别、校验码等信息。因此,它们通常会被用于创建文本索引或函数索引。
    对于单据号、证件号类型的字符串,我们通常使用CHAR类型字段来存储。
    4.4 普通字符串
    对于诸如“产品型号”、“产品规格”等一般业务属性字符串,通常符合变长、长度不超过4000字节的特征。
    因此,我们可以使用VARCHAR2来存储这个类型的字符串。
    4.5 静态页面、大文本
    在一些web项目中,我们会将静态页面文件存储在数据库表中。一些基于诸如FreeMarker等模版引擎的项目也会将模版文件存储于数据库表中。另外,一些类似论坛、博客、新闻功能的应用也存在存储大量字符串的需求。
    对于以上类型的需求,用排除法可知,能够几乎不受长度限制进行大文本存储的类型只有CLOB和NCLOB。当然,依前所述,我更倾向于使用CLOB。

    展开全文
  • 现在有两个字符串valA(a,b,c,d)、字符串valB(2,3,b)现在需要匹配B字符串中有没有数据在A中出现,如果有就标识条件成立。如果有上面这么一个情况以上的方式就难以处理了,我们一贯的做法市采用多个OR来拼接查询...

    Oracle中的INSTR增强方法

    在使用oracle数据库的查询中,我们都会碰到多字段的查询条件,有like的模糊匹配,有in的过滤,有instr的筛选。现在有两个字符串valA(a,b,c,d)、字符串valB(2,3,b)现在需要匹配B字符串中有没有数据在A中出现,如果有就标识条件成立。如果有上面这么一个情况以上的方式就难以处理了,我们一贯的做法市采用多个OR来拼接查询条件。在使用拼接查询条件过程中往往需要在编程代码或者在数据库服务器上拼接SQL,这样往往让代码的可读性变得很差。那我们今天就说说如何实现。

    • Oracle自定义方法的使用场景
    • 实现instr增强的方法
    • 使用示例

    Oracle自定义方法使用场景

    在编程的路上,我们都会遇到oracle的各种存储过程,视图,方法,触发器……这些所有的oracle提供的对象,我们较常用的是存储过程和视图。

    在oracle中存储和函数都能支持输入和输出,为什么我们工作中实际用到的更多的是存储过程而不是函数呢?因为我们往往要返回大量的查询数据,但是函数只能支持一个参数的放回,而且在编写函数的时候使用代码掉用也不容易理解。那什么情况下我们需要使用函数呢?
    我的理解如下,当你只有一个返回值(而且非游标数据类型)或者需要做为select语句的表达式进行执行的时候就可以考虑采用函数。第一种情况很好理解,第二种情况的意思就是当你要写一个辅助的逻辑(非业务逻辑)的计算,这个辅助可能在其他很多地方都可以重复利用更业务无关的时候就可以考虑使用自定义函数,我们现在要做的是instr的增强,就是辅助计算,所以采用了自定义方法来实现。

    实现instr增强的方法

    在使用instr的时候我们其实是使用了类似indexOf的操作,如果匹配查找字符串的位置(返回值)大于0,我们就认为条件成立,也就是instr(valA,valB)>0。这样做的弊端就是如果需要查找的valB不是在valA中全匹配,那么就没法满足了。

    我们现在将instr增强的思路就是,在输入参数valA中定义查找的范围(并采用逗号分隔),在待匹配参数valB中定义所有需要查找的数据(用逗号分隔)。我们在匹配的时候先把valB用逗号切分,然后将每个切分的数据在valA中去查找,如果有我们就任务条件成立。这就是instr增强的思路。instr增强可以处理如下场景:valA(a,b,c,d)、valB(1,2,3,d)。FUN_INSTR_CONTAINS(valA,valB)>0条件成立。

    代码块

    FUN_INSTR_CONTAINS完整代码如下:

    CREATE OR REPLACE FUNCTION FUN_INSTR_CONTAINS(valA IN VARCHAR2,
                                                                                                     valB IN VARCHAR2)
        RETURN NUMBER IS
        FUNCTIONRESULT NUMBER;
      strTmp VARCHAR2(4000);
      l_str VARCHAR2(500);
      ind NUMBER;
    BEGIN
      strTmp := valB;
      FUNCTIONRESULT:=0;
      ind:=instr(strTmp,',');
      WHILE ind>0 LOOP
         l_str:=substr(strTmp,0,ind-1);--截取第一个逗号分割数据
         strTmp := substr(strTmp,ind+1);--剩余待处理
         ind:=instr(strTmp,',');--重新赋值
         SELECT instr(valA,l_str) INTO FUNCTIONRESULT FROM dual;
         dbms_output.put_line(l_str);
         dbms_output.put_line(strTmp);
         EXIT WHEN FUNCTIONRESULT>0 OR ind=0;
      END LOOP;
        RETURN(FUNCTIONRESULT);
    END FUN_INSTR_CONTAINS;

    使用示例

    select FUN_INSTR_CONTAINS(valA,valB)from dual;

    通过以上处理,我们就可以不用拼接SQL的字符串来处理这种特殊的情况,有些人可能会有疑问,为什么会有这种场景。举个例子:在一个字段中通过group by可能会产生合并结果集(a,b),在提供系统查询的时候,该字段可能属性有多种(a,b,c,d)而且系统提供复选框,这个意思就是系统提供的该字段筛选可以出现(a,b,c,d),后台数据合并之后可能出现的是两种或两种以上的属性(c,d),这时候就需要使用增强instr来处理,而且不用拼接SQL。效率也不会太差,因为改函数处理的是当前行数据的值。

    展开全文
  • 【Oracle】Oracle字符串长度

    千次阅读 2013-06-15 15:13:41
    Oracle获取字符串长度函数length()和hengthb() lengthb(string)计算string所占的字节长度:返回字符串的长度,单位是字节。 length(string)计算string所占的字符长度:返回字符串的长度,单位是字符。 对于单...
    Oracle获取字符串长度函数length()和hengthb()
    

    lengthb(string)计算string所占的字节长度:返回字符串的长度,单位是字节。
    length(string)计算string所占的字符长度:返回字符串的长度,单位是字符。

    对于单字节字符,LENGTHB和LENGTH是一样的。
    如可以用length(‘string’)=lengthb(‘string’)判断字符串是否含有中文。
     
    注:
    一个汉字在Oracle数据库里占多少字节跟数据库的字符集有关,UTF8时,长度为三。
    select lengthb(''飘'') from dual   可查询汉字在Oracle数据库里占多少字节。
    展开全文
  • lengthb(string)计算string所占的字节长度:返回字符串的长度,单位是字节 ...【备注】一个汉字在Oracle数据库里占多少字节跟数据库的字符集有关,UTF8时,长度为三 PS:oracle去掉字符串中所有指定字符 Selec
  • ORACLE 10G修改字符编码没有超字符集的限制,可以直接修改成自己想要字符串,之前已经存在数据就需要重新再导入
  • Oracle几个字符串函数

    2013-05-30 11:56:36
    平常我们用Oracle主要有两种字符串类型: 1、Char始终为固定的长度,如果设置了长度小于Char列的值,则Oracle会自动用空格填充的。当比较Char时,Oracle用空格将其填充为等长,再进行比较; 2、VarChar2数据类型...
  • SQL_oracle_将字符串分割成结果

    千次阅读 2017-07-27 15:57:42
    问题:将以逗号分隔的字符串使用sql转换成结果,如字符串:gonzo,kermit,fozzie 方案: select regexp_substr('gonzo,kermit,fozzie' || ',', '[^,]+', 1, rownum) as field  from dual connect by rownum  ...
  • 设计客户端nls_lang这个变量的作用是讲oracle服务端发来的所有字符串(包括错误消息字符串和表里字符串字段)的以服务端数据库字符集 编码的编码值转码为客户端字符集(狭义,即操作系统字符集)的编码值 故客户端...
  • Oracle字符串函数

    2014-11-17 15:50:15
    Oracle字符串函数 最近换了新公司,又用回Oracle数据库了,很多东西都忘记了,只是有个印象,这两晚抽了点时间,把oracle对字符串的一些处理函数做了一下整理,供日后查看。。 平常我们用Oracle主要有两种字符串...
  • Oracle SQL多行字符串拆分使用层次查询(connect by)、正则表达式
  • 几乎所有数据库字符集如果用length()来计算长度都是8。但是在不同字符集的数据库中用lengthb()来计算,长度就是不同的。 原因是数据库字符集对中文括号的所占的字节数不同。 select *fromv$version;--查询...
  • centos 7 oracle 用户修改字符集

    千次阅读 2018-11-15 17:43:16
    我是linux 新手,不一定能解决问题(防止误导您) ...2 修改oracle 用户字符串编码 (centos 7 没有 i18n文件,取而代之的是)  vim /etc/locale.conf 添加 LANG="zh_CN.UTF-8" ...
  • Oracle获取字符串长度

    2011-11-14 09:47:32
    Oracle中常用的字符串长度获取方法,有两个:lengthb(string)和length(string);(b是byte字节的意思) 其中: lengthb(string)计算string所占的字节长度:返回字符串的长度,单位是字节 length(string)计算string所占...
  • 一个汉字在Oracle数据库里占多少字节跟数据库的字符集有关,UTF8时,长度为三。 select lengthb(‘飘’) from dual 可查询汉字在Oracle数据库里占多少字节 以上就是本文关于Oracle字符串长度函数le
  • ORACLE字符串

    千次阅读 2013-01-21 10:13:04
    Oracle字符串函数 最近换了新公司,又用回Oracle数据库了,很多东西都忘记了,只是有个印象,这两晚抽了点时间,把oracle对字符串的一些处理函数做了一下整理,供日后查看。。 平常我们用Oracle主要有两种字符...
  • Oracle数据库时间与字符串转换

    千次阅读 2015-09-22 14:08:15
    Oracle数据库时间与字符串转换    oracle时间与字符串转换 Year:   yy two digits 两位年 显示值:07   yyy three digits 三位年 显示值:007   yyyy four digits 四位年 显示值:2007   ...
  • Oracle字符集及其查看和修改

    万次阅读 2016-06-07 17:53:38
    Oracle中查看所用字符集及修改字符集
  • oracle 字符串切割成结果方法

    千次阅读 2013-07-02 19:36:11
    oracle行专列思路 方法一: SELECT COLUMN_VALUE FROM TABLE(SYS.ODCIVARCHAR2LIST('1','2','3','4','5')); 方法二:select regexp_substr('1,2,3,4,5','[^,]+',1,rownum) from dual connect by rownum 方法三:...
  • 第一种方法: select Replace(a.STHOUSENAME,‘仓房’,’’), a.* from eb_bms_st_store a; 第二种方法: select a.STHOUSENAME ,substr(a.STHOUSENAME,1,length(a.STHOUSENAME) -2 ) from eb_bms_st_store a
  • 最近修改oracle触发器,在过程中遇到两个问题: select lastname from hrmresource where id in (waigaunyanshourens); 此sql只要功能:根据id 到人力资源表找相应的人名; 此处waigaunyanshourens 是一个存储...
  • Oracle 字符串文字太长

    千次阅读 2018-07-24 11:34:01
    表 A 中有个字段为 备注 remark,用户在添加备注的时候超过... NCLOB 根据字符集而定的字符数据 CLOB 字符数据 本例就以LONG为例做一个示范. 第一步:新增一个为LONG类型的新字段remarkbak alter table A add ...
  • .net 访问Oracle的连接字符串

    千次阅读 2014-03-13 12:12:44
    方法一:通过System.Data.OracleClient(需要安装Oracle客户端并配置tnsnames.ora) 这个大家都知道,就不细说了 oracleConnectionString : data source = orcl;user id= scott; password=tiger;persist security ...
  • Oracle中字符和字符串的截取

    千次阅读 2017-02-04 11:20:23
    日常工作中,经常会遇到字符串截取的场景,有时候需要截取字符串的前面部分,有时则需要截取字符串的后半部分,甚至有时需要去除中间的某一个字符或字符串,这时玩家们需要掌握日常常用的几个oracle库函数即可...
  • oracle字符串处理函数汇总

    千次阅读 2018-08-11 10:59:22
    字符函数的返回类型所受的限制和基本数据库类型所受的限制是相同的,比如: VARCHAR2数值被限制为2000字符(ORACLE 8中为4000字符),而CHAR数值被限制为255字符(在ORACLE8中是2000).当在过程性语句中使用时,...
  • oracle将多个结果用逗号拼接成字符串 有两个函数wmsys.wm_concat和listagg wm_concat(column) LISTAGG(item_val,',') WITHIN GROUP(ORDER BY item_val)
  •  如何快速的判断出指定字符串中是否包含中文呢? 2.解决方案  通过length()和lengthb()函数的比对结果进行判断。  lengthb(string)计算string所占的字节长度:返回字符串的字节长度,单位是字节;  length...
  • Oracle 聚合字符串

    千次阅读 2015-02-25 20:50:30
    -- Start -- 待续 --更多参见:Oracle SQL 精萃 -- 声明:转载请注明出处 -- Last edited on 2015-02-25 -- Created by ShangBo on 2015-02-25 -- End

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 80,140
精华内容 32,056
关键字:

oracle改显字符串字符集