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