Oracle学习之数据类型

Oracle数据库的数据类型与其它的数据库系统相比,它的数据类型不多,Oracle在表示数据方面比其他数据库系统来说要省去许多关键字。Oracle只用NUMBER(m,n)就可以表示任何复杂的数字数据。其它如日期类型等也简单得多,只DATE就表示日期和时间。下面以列表形式给出各个版本的Oracle系统数据类型的表示方法。下面给出Oracle旧版本的数据类型的目的是让读者了解Oracle的变化,另外就是你在对旧版本进行升级或数据转换时要注意各个版本的差别。

 

ORACLE5ORACLE6数据类型

 

数据类型

说明

Char

可变长字符型,≤254

Varchar2

可变长字符型,≤2000

Number(m,n)

数字类型,含整数、小数等

Date

日期型,含时间,缺省格式为mmm-dd-yyyy hh:mi:ss(占7字节)

Long

存储大型可变长字符串,≤2GB

Raw

存储短二进制串,≤2GB

Long  raw

存储长二进制串,≤2GB

                               ORACLE7数据类型

数据类型

说明

Char

定长字符,≤255个字符

Varchar

变长字符,≤2000个字符

Varchar2

变长字符,≤2000个字符

Number(m,n)

数字类型,含整数、浮点、双精度等

Long

存储大型可变长字符串,≤2GB

Raw

存储可变短二进制数,≤2000

Long  raw

存储大型可变长二进制数,≤2GB

 

                      ORACLE8/8i  数据类型

 

数据类型

说明

Char

定长字符,≤2000个字符

Varchar

(同Varchar2)可变字符,≤4000个字符

Varchar2

变长字符,≤4000个字符

Date

固定长度(7字节)的日期型

Number

数字型,可存放实型和整型

Long

可变字符,≤2GB个字符

Raw

可变二进制数据,≤4000字节

Long  raw

可变二进制数据,≤2GB

MLSLABEL

Trusted Oracle 用长度在2~5字节间

Blob

大二进制对象,≤4GB

Clob

大字符串对象,≤4GB

Nclob

多字节字符集的Clob,≤4GB

Bfile

外部二进制文件,大小由OS决定

 

 

CHAR(<size>)

定长字符型(在Oracle5 Oracle6 是变长),字符长度不够自动在右边加空格符号。当字符长度超出2000个则错误。不指定大小缺省为 1

 

VARCHAR(<size>)

可变字符型,当前与VARCHAR2(<size>)相同。

 

VARCHAR2(<SIZE>)

可变字符型,当前与VARCHAR(<size>)相同。VARCHAR2 类型的字段(列)可存放4000个字符;但是VARCHAR2 变量可以存放32,767 个字符。大小必须指定。

 

NCHAR(<size>)NVARCHAR2(<size>)

NCHAR NVARCHAR2 分别与 CHARVARCHAR2 有相同的大小。并用于于存放 National Language Support (NLS)数据,Oracle 允许以本地语言存放数据和查询数据。

如果将列名声明成NCHARNVARCHAR2这样的类型,则insert select 等语句中的具体值前加N,不能直接按照普通字符类型进行操作。看下面例子:

 

SQL> create table nchar_tst(name nchar(6),addr nvarchar2(16),sal number(9,2));

 

表已创建。

 

SQL> insert into nchar_tst values(N'赵元杰',N'北京市海淀区',9999.99);

 

已创建 1 行。

 

SQL> select * from nchar_tst where name like N'赵%';

 

NAME   ADDR                    SAL

------ ---------------- ----------

赵元杰 北京市海淀区       9999.99

 

SQL> select * from nchar_tst where name like '%';

select * from nchar_tst where name like '%'

                                        *

ERROR 位于第 1 :

ORA-12704: 字符集不匹配.

 

提示:虽然Oracle可以使用nchar, nvarchar2 类型来存放字符数据,但建议设计者不要使用NCHARNVARCHAR2。因为CHARVARCHAR2就能存放汉字。

 

NUMBER(<p>,<s>)

 

 <p>是数据的整数部分,<s>是数据的精度(即小数)部分,注意,<s>部分可以表示负的精度。用<s>可以表示从小数点往右或往左保留多少位。如下表:

 

实际值

数据类型

存储值

1234567.89

Number

1234567.89

1234567.89

Number(8)

1234568

1234567.89

Number(6)

出错

1234567.89

Number(9,1)

1234567.9

1234567.89

Number(9,3)

出错

1234567.89

Number(7,2)

出错

1234567.89

Number(5,-2)

1234600

1234511.89

Number(5,-2)

1234500

1234567.89

Number(5,-4)

1230000

1234567.89

Number(*,1)

1234567.9

 

 

Sal  number(7,2),  --表示5位整数,2位小数.

 

DATE

Oracle 的日期型用7个字节表示,每个日期型包含如下内容:

l       Century (世纪)

l       Year (年)

l       Month(月)

l       Day (天)

l       Hour (小时)

l       Minute (分)

l       Second (秒)

 

日期型字段有下面特点:

 

l       日期型字段的插入和更新可以数据型或字符并带to_date 函数说明即可。

l       缺省的日期格式有NLS_DATE_FORMAT参数控制,它的缺省格式为DD-MON-YY

l       缺省的时间是夜里 00:00:00 (0 00)

l       sysdate返回的是服务器的时间,见下面例子。

l       日期格式的显示可以设置,见下面例子。

l       日期型可以运算,见下面例子。见下面例子。

l       世纪用cc 表示;年用yyyy表示,月用mm表示,日用dd表示,小时用hh24表示,分用mi表示,秒用ss表示。

例子:

SQL> create table save_info(per_id varchar2(20),name varchar2(20),tran_date date,

  2  tran_val number(12,2));

 

表已创建。

 

SQL>  insert into save_info values ( '110105540609811','赵元杰',

  2  to_date('2001.06.18','yyyy.mm.dd'),12345.66);

 

已创建 1 行。

 

SQL> select * from save_info;

 

PER_ID               NAME                 TRAN_DATE    TRAN_VAL

-------------------- -------------------- ---------- ----------

110105540609811      赵元杰               18-6 -01   1234.66

 

SQL> select per_id,name,to_char(tran_date,'yyyy/mm/dd'),tran_val from save_info;

 

PER_ID               NAME                 TO_CHAR(TR   TRAN_VAL

-------------------- -------------------- ---------- ----------

110105540609811      赵元杰               2001/06/18   12345.66

 

 

SQL> show parameter nls_date_format

 

NAME                                 TYPE    VALUE

------------------------------------ ------- ------------------------------

nls_date_format                      string

 

 

SQL> alter session set nls_date_format=

  2  '"公元"yyyy""mm""dd""';

 

会话已更改。

 

SQL> select sysdate from dual;

 

SYSDATE

------------------

公元20010518

 

 

SQL> select to_char(sysdate,'cc yyyy.mm.dd') from dual;

 

TO_CHAR(SYSDA

-------------

21 2001.05.18

 

关于日期型的使用方法详细请参考《Oracle8i National Language Support Guide》。

 

 

BLOB

大二进制对象,每条记录可存储达4GB的数据,详细见后面章节。

 

CLOB

大字符对象,每条记录可存储达4GB的数据,详细见后面章节。

 

BFILE

外部二进制文件,每条记录可存储达4GB的数据(与OS有关),详细见后面章节。

 

RAW

非结构的二进制数据,这些数据不被数据库系统解释。RAW可以存储达2,000字节。

 

LONGRAW

大的二进制类型数据,LONGRAW是非结构的二进制数据,这些数据不被数据库系统解释。LONGRAW可以存储达2GB字节。LONGRAW不能被索引,而RAW可以被索引。

 

ROWID

ROWIDOracle数据库中是一个虚的列,即系统用的特殊的列,不是我们建立的列。用于对数据库中的每条记录进行定位。详细见“Rowid的使用”章节。

 

UROWID

UROWID Universal ROWID 的意思。即全球ROWID,它支持逻辑和物理ROWID,也作为外部表的(通过getway 访问的非Oracle 表)的ROWIDUROWID类型可以存储所有的ROWID类型的数据。

 

 

%TYPE类型的匹配:

             books_printed         number(6)

             books_sold             books_printed%TYPE

             books_sold的数据类型与book_printed的类型一致;

( %TYPE类型 在 PL/SQL中介绍 )

 

 

空值与字符型、数字型的运算:

        null + <数字>=null            (空值+数字仍是空值)

        null > <数字>=null            (空值与数字比较结果为空值)

        null || '字符串' = 字符串

 

number类型与以下类型具有同等的值域:

       DEC

       Decimal

       Double   PREcision

       Float

       Integer

       Int

       Numeric

       Real

       Smallint

 

提示:虽然Oracle可以使用上面的子数据类型,但建议还是采用NUMBER(n,m)为好。因为如果使用子数据类型定义字段类型不当,可能引起数据在运算方面的问题。

 

Long数据类型的限制:

l       select中可以用long

l       update中可以用select子句;

l       insert中可以用Valus子句;

l       每个表只能允许一个long列;

l       long列不能列出完整性约束(nullnot   null除外);

l       long列不能被索引;

l       过程或存储函数不能接收long型函数;

l       存储函数不能返回long型值。

 

 

long  目前不能出现在以下情况中:

l       select中的WhereGroup  byorder  byConnect  bydistinct

l       不能对long列作substrinstr

l       表达式或条件;

l       子查询或集合中不能用long

l       Create   table   ...as   select   中不能用long

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值