二、數字型別
三、日期型別
四、clob和blob型別
五、rowid型別
六、其它資料型別
oracle的資料型別有二十多種,包括字串型別、數字型別、日期型別、lob型別、long raw& raw型別、rowid & urowid型別。太多的資料型別很容易讓初學者感到迷茫,在本文中,我將以程式設計師的視角,結合實際開發的需求來介紹oracle的資料型別。
oracle的資料型別雖然很多,但實用的只有以下幾種:
1)字串型別:char和varchar2,可表達任何字串。
2)數字型別:number(m,n),可表達任何數字,m是數字的總長度,n是小數點後的位數,如果n為0則表示是乙個整數。
3)日期型別:date,存放日期和時間,包括年(yyyy)、月(mm)、日(dd)、小時(hh24)、分(mi)、秒(ss)。
4)clob型別,存放單位元組字串或多位元組字串資料,如文字檔案、xml檔案。
6)rowid型別,存放表中記錄在資料庫中的實體地址。
在c/c++語言中用,字串用雙引號包含起來,在oracle資料庫中,字串用單引號包含起來的,如下:
『www.freecplus.net』
『碼農有道』
'乙隻傻傻鳥 』
固定長度字串用char表示,當存入資料內容的長度不夠時,oracle將在資料內容後面自動填充空格以達到其固定的長度,例如char(10)總是包含10位元組資訊。
char欄位最多可以儲存2000位元組的內容。
變長度字串用varchar2表示,與char型別不同,oracle不會在資料內容後面填充任何內容。
varchar2欄位最多可以儲存4000位元組的內容,從oracle 12c版本開始,可以儲存32767位元組的內容。
char(10),如果存入』freecplus』,在資料庫中將儲存』freecplus ',在最後補了乙個空格。
varchar2(10),如果存入』freecplus』,在資料庫中將儲存』freecplus』,什麼也不會補。
在實際應用中,我們並不希望oracle給字串後面補空格,那麼是不是可以棄用char型別呢?不是,我們一般用char型別存放固定大小的資料內容,例如身份證號碼,固定是18位的,用char(18)就非常合適,能用varchar2(18)可以存放身份證號碼嗎?當然可以,但是,char(18)的效率比varchar2(18)的效率要高很多。
總結一下,如果確定、肯定、一定、保證存入字串的長度是固定不變的,例如性別、身份證號碼、手機號碼,用char型別,否則用varchar2型別,例如姓名、學歷、位址、興趣愛好等,char雖然死板,但是效率高。
每個漢字佔多少位元組要看具體的編碼方式,如utf-8(1-3位元組)、gb2312(2位元組)、gbk(2位元組)、gb18030(1、2、4位元組)。
oracle用number型別來存放數字,該型別能儲存精度最多達38位,遠遠高於程式語言中常規的 long int和double型別。
number( m,n),m表示總長度,n表示小數字的精度,如果存入的資料的小數字的精度超過了n,則取四捨五入後的值。
例如:number(10,3),10是總長度,3是小數後的位數,如123.456。
如果存入123.4567,實際際將是123.457。
如果存入12345679.899,總長度超出了10,oracle將提示錯誤。
如果打算存入整數,用number(m)就可以了,m表示可以存入資料的最大位數。
oracle採用date型別表示日期和時間,這是乙個7位元組的固定寬度的資料型別,有7個屬性,包括:世紀、世紀中哪一年、月份、月中的哪一天、小時、分鐘和秒。
對程式語言來說,日期和時間是用字串來顯示和書寫的,oracle提供了to_date和to_char兩個函式在date型別和字串型別之間轉換。
例如:
insert into t_girl
(name,birthday)
values
('西施'
,to_date
('2000-01-01 01:12:35'
,'yyyy-mm-dd hh24:mi:ss'))
;select name,
to_char
(birthday,
'yyyy-mm-dd hh24:mi:ss'
) from t_girl where name=
'西施'
;
clob型別,變長的字串大物件,最長可達4gb,clob可以儲存單位元組字串或多位元組字串資料,clob被認為是乙個更大的字串。當資料庫的字符集發生轉換時,clob型別會受到影響。
oracle資料庫中每個表的每行記錄都有乙個儲存的物理位置,即表的rowid偽列,採用rowid作為where條件的訪問效率最高。
rowid的訪問效率雖然是最高的,但是,在實際應用中要謹慎,需要注意兩個問題:
1)rowid存放的是表記錄的物理位置,在資料整理、資料備份和遷移的時候,記錄的物理位置會發生改變;
2)rowid是oracle資料庫專有的資料型別,與其它的資料庫不相容。
在上面的內容中,介紹了oracle最常用的資料型別,可以滿足99%以上的應用場景。
oracle提供了22中不同的sql資料型別,其它的資料型別不一定實用,但我還是把它們全部列出來,大家了解一下,不必深入研究。二十年來,其它的資料型別我從未使用過。
char:定長字串,會用空格填充來達到最大長度。非null的char(10)包含10個位元組資訊。char欄位最多可以儲存2000個位元組資訊。
nchar:包含unicode格式資料的定長字串。nchar欄位最多可儲存2000位元組的資訊。
varchar2:是varchar的同義詞。這是乙個變長字串,與char型別不同,它不會用空格將字段或變數填充至最大長度。varchar(10)可能包含0~10位元組的資訊,最多可儲存4000位元組資訊。從12c起,可以儲存32767位元組資訊。
nvarchar2:包含unicode格式資料的變長字串。最多可儲存4000位元組資訊。從12c起,可以儲存32767位元組資訊。
raw:一種變長二進位制資料型別,採用這種資料型別儲存的資料不會發生字符集轉換。
number:能儲存精度最多高達38位的數字。這種型別的資料會以變長方式來儲存,長度在0~22位元組。
binary_float:32位單精度浮點數,可以支援至少6位精度,占用磁碟上5個位元組的儲存空間。
binary_double:64位雙精度浮點數,可以支援至少15位精度,占用磁碟上9個位元組的儲存空間。
long:這種型別能儲存最多2gb的字元資料
long raw:long raw型別能儲存多達2gb的二進位制資訊
date:這是乙個7位元組的定寬日期/時間資料型別,其中包含7個屬性:世紀、世紀中的哪一年、月份、月中的哪一天、小時、分鐘、秒。
timestamp:這是乙個7位元組或11位元組的定寬日期/時間資料型別,它包含小數秒。
timestamp with time zone:這是乙個13位元組的timestamp,提供了時區支援。
timestamp with local time zone:這是乙個7位元組或11位元組的定寬日期/時間資料型別,在資料的插入和讀取時會發生時區轉換。
interval year to month:這是乙個5位元組的定寬資料型別,用於儲存乙個時段。
interval day to second:這是乙個11位元組的定寬資料型別,用於儲存乙個時段。將時段儲存為天/小時/分鐘/秒數,還可以有9位小數秒。
blob:這種型別能夠儲存最多4gb的資料。
clob:這種型別能夠儲存最多4gb的資料。當字符集發生轉換時,這種型別會受到影響。
nclob:這種型別能夠儲存最多4gb的資料。當字符集發生轉換時,這種型別會受到影響。
bfile:這種資料型別可以在資料庫列中儲存乙個oracle目錄物件和乙個檔名,我們可以通過它來讀取這個檔案。
urowid:是乙個通用的rowid,沒有固定的rowid的表。
oracle資料型別
char 用於描述定長的字元型資料,長度 2000位元組 varchar2 用於描述變長的字元型資料,長度 4000位元組 nchar 用來儲存unicode字符集的定長字元型資料,長度 1000位元組 nvarchar2 用來儲存unicode字符集的變長字元型資料,長度 1000位元組 numb...
Oracle資料型別
一 概述 標量 scalar 復合 composite 引用 reference lob 二 標量 scalar 合法的標量型別與資料庫的列所使用的型別相同,此外它還有一些擴充套件。它又分為七個組 數字 字元 行 日期 行標識 布林和可信。數字,它有三種基本型別 number pls integer...
Oracle 資料型別
資料型別 引數描述 char n n 1 to 2000位元組 定長字串,n位元組長,如果不指定長度,預設為1個位元組長 乙個漢字為2位元組 varchar2 n n 1 to 4000位元組 可變長的字串,具體定義時指明最大長度n,這種資料型別可以放數字 字母以及ascii碼字符集 或者ebcdi...