oracle之SQL的数据类型

SQL的数据类型

3.1 四种基本的常用数据类型(表的字段类型)

1、字符型, 2、数值型,3、日期型,4、大对象型

3.1.1 字符型:
    char         固定字符,最长2000个
    varchar2     可变长字符,最长4000个,最小值是1
    nchar/nvarchar2     NCHAR/NVARCHAR2类型的列使用国家字符集
    raw和long raw       固定/可变长度的二进制数据长度 最长2G,可存放多媒体图象声音等。(老类型,逐步淘汰)
    LONG        可变长的字符串数据,最长2G,LONG具有VARCHAR2列的特性,一个表中最多一个LONG列。(老类型,逐步淘汰)。

3.1.2 数值型:
    number(p,s) 实数类型,以可变长度的内部格式来存储数字。这个内部格式精度可以高达38位。
    int         整数型,number的子类型,范围同上

3.1.3 日期型:

    date    日期的普通形式,表示精度只能到秒级。
    timestamp   日期的扩展形式,表示精度可达秒后小数点9位(10亿分之1秒)。
    timestamp with timezone  带时区
    timestamp with local timezone 时区转换成本地日期

    系统安装后,默认日期格式是DD-MON-RR, RR和YY都是表示两位年份,但RR是有世纪认知的,它将指定日期的年份和当前年份比较后确定年份是上个世纪还是本世纪(如表)。

    当前年份       指定日期     RR格式        YY格式
    ------------------------------------------------------------------------------
    1995          27-OCT-95     1995        1995
    1995           27-OCT-17     2017        1917
    2001          27-OCT-17     2017        2017
    2013          27-OCT-95     1995        2095

3.1.4 LOB型:大对象是10g 引入的,在11g中又重新定义,在一个表的字段里存储大容量数据,所有大对象最大都可能达到4G

    CLOB: 用来存储单字节的字符数据,包含在数据库内。
  NCLOB:用来存储多字节的字符数据 
  BLOB:用于存储二进制数据,包含在数据库内。
    BFILE:存储在数据库之外的二进制文件中,这个文件中的数据只能被只读访问。

CLOB,NCLOB,BLOB都是内部的LOB类型,没有LONG只能有一列的限制(考点)。
  
 保存图片或电影使用BLOB最好、如果是小说则使用CLOB最好。
 虽然LONG RAW也可以使用,但LONG是oracle将要废弃的类型,因此建议用LOB。
    当然说将要废弃,但还没有完全废弃,比如oracle 11g里的重要视图dba_views,对于text(视图定义)仍然沿用了LONG类型。
 
Oracle 11g重新设计了大对象,推出SecureFile Lobs的概念,相关的参数是db_securefile,采用SecureFile Lobs的前提条件是11g以上版本,ASSM管理等,符合这些条件的BasicFile Lobs也可以转换成SecureFile Lobs。较之过去的BasicFile Lobs, SecureFile Lobs有几项改进:

1)压缩,2)去重,3)加密。

当create table定义LOB列时,也可以使用LOB_storage_clause指定SecureFile Lobs或BasicFile Lobs
而LOB的数据操作则使用Oracle提供的DBMS_LOB包,通过编写PL/SQL块完成LOB数据的管理。

3.2 数据类型的转换

隐性类型转换和显性类型转换。

3.2.1 隐性类型转换:

是指oracle自动完成的类型转换。在一些带有明显意图的字面值上,可以由Oracle自主判断进行数据类型的转换。 如:

SQL> select empno,ename from emp where empno='7788';    //empno本来是数值类型的,这里字符'7788'隐性转换成数值7788

     EMPNO ENAME
---------- ----------
      7788 SCOTT

SQL> select length(sysdate) from dual;        //将date型隐转成字符型后计算长度

LENGTH(SYSDATE)
---------------
             19

SQL> SELECT '12.5'+11 FROM dual;        // 将字符型‘12.5’隐转成数字型再求和

 '12.5'+11
----------
      23.5

SQL> SELECT 10+('12.5'||11) FROM dual;        //将数字型11隐转成字符与‘12.5’合并,其结果再隐转数字型与10求和

10+('12.5'||11)
---------------
         22.511


3.2.2 显性类型转换是强制完成类型转换(推荐),有三种形式的转换函数:

TO_CHAR
TO_DATE
TO_NUMBER

1)日期-->字符

SQL> select ename, hiredate, to_char(hiredate, 'DD-MON-YY') month_hired from emp where ename='SCOTT';

ENAME      HIREDATE            MONTH_HIRED
---------- ------------------- --------------
SCOTT      1987-04-19 00:00:00 19-4月 -87

fm压缩空格或左边的'0'

SQL> select ename, hiredate, to_char(hiredate, 'fmyyyy-mm-dd') month_hired from emp where ename='SCOTT';

ENAME      HIREDATE            MONTH_HIRED
---------- ------------------- ------------
SCOTT      1987-04-19 00:00:00 1987-4-19

//其实DD-MM-YY是比较糟糕的一种格式,因为当日期中天数小于12时,DD-MM-YY和MM-DD-YY容易造成混乱。


2)数字-->字符:9表示数字,L本地化货币字符

SQL> select ename, to_char(sal, 'L99,999.99') Salary from emp where ename='SCOTT';

ENAME      SALARY
---------- --------------------
SCOTT                ¥3,000.00

3)字符-->日期

SQL> select to_date('1983-11-12', 'YYYY-MM-DD') tmp_DATE from dual;

TMP_DATE
-------------------
1983-11-12 00:00:00

4)字符-->数字:

SQL> SELECT to_number('$123.45','$9999.99') result FROM dual;

    RESULT
----------
    123.45

考点:使用to_number时如果使用较短的格式掩码转换数字,就会返回错误。不要混淆to_number和to_char转换。

例如:

SQL> select to_number('123.56','999.9') from dual;
select to_number(123.56,'999.9') from dual
                 *
第 1 行出现错误:
ORA-01722: 无效数字

SQL> select to_char(123.56,'999.9') from dual;

TO_CHA
------
 123.6

posted on 2018-06-11 10:18  小孩没穿鞋  阅读(308)  评论(0编辑  收藏  举报

导航