oracle資料庫的欄位類型
1. 「ORACLE」中有哪些數據類型
Oracle中的數據類型有:字元型、數字型、日期型等。具體介紹如下:
1、字元型:char(n):用於標識固定長度的字元串。
當實際數據不足定義長度時,使用空格補全右邊不足位。varchar(n):可變字元串類型。
為SQL標准規定的,資料庫必須實現的數據據類型。可以存儲空字元串。
varchar2(n):可變字元串類型,是oracle在varchar的基礎上自行定義的可變長度字元串
類型。當做為列類型使用時,最大長度可被定義為4000;當做為變數類型使用時,長度
可被定義為32767。不可以存儲空字元串。
2、數值型:可用於存儲整數、浮點數。
number(m,n):m表示有效數字的總位數(最大為38位),n表示小 數位數。
3、日期時間型:
date:包含Year(年)、Month(月) 、Day(天)、Hour(時)、Minutes(分)、Second(秒)
說明:(yyyy表示4位年分;mm表示月份;dd表示天;hh表示時;mi表示分;ss表示秒)
4、大對象類型:lob:用於存儲大對象類型。例如:文本信息長度超過4000、二進制文件等。最大容量為4GB。
lob分類:clob:用於存儲大型文本數據。(例如:備注信息)
blob:用於存儲二進制數據。(例如:圖片文件)
bfile:作為獨立文件存在的二進制數據。
5、特殊數據:
null與空字元串:null與空字元串,都要用is null或is not null進行比較。
單引號:想將單引號做為字元中使用,請通過單引號進行轉義。
6、注意:oracle中,沒有布爾類型,可利用字元串或數值(1/0)表示
2. oracle資料庫怎麼查看錶中欄位類型
select * from user_tab_columns t where t.TABLE_NAME='表名';--查詢某個表的欄位,及類型
select * from user_col_comments t where t.TABLE_NAME='表名';--查詢某個表的欄位注釋
3. oracle 數據類型
按類型分為:字元串類型、數字類型、日期類型、LOB類型、LONG RAW& RAW類型、ROWID & UROWID類型。
在講敘字元串類型前,先要講一下編碼。字元串類型的數據可依編碼方式分成資料庫字元集(CHAR/VARCHAR2/CLOB/LONG)和國際字元集(NCHAR/NVARCHAR2/NCLOB)兩種。資料庫中的字元串數據都通過字元集將字元轉換為數字後(二進制),才存儲到數據塊中。通過不同的編碼集轉換,即便是相同的字元,也可能會轉換成不同的二進制編碼。這也是產生亂碼的原因。資料庫的編碼格式一般是在創建資料庫時指定的。當然也可以修改資料庫的編碼。
一 字元串類型
1.1:CHAR類型 CHAR(size [BYTE | CHAR])
CHAR類型,定長字元串,會用空格填充來達到其最大長度。非NULL的CHAR(12)總是包含12位元組信息。CHAR欄位最多可以存儲2,000位元組的信息。如果創建表時,不指定CHAR長度,則默認為1。另外你可以指定它存儲位元組或字元,例如 CHAR(12 BYTYE) CHAR(12 CHAR).一般來說默認是存儲位元組
注意:資料庫的NLS_CHARACTERSET 為AL32UTF8,即一個漢字佔用三到四個位元組。如果NLS_CHARACTERSET為ZHS16GBK,則一個字元佔用兩個位元組。
1.2: NCHAR類型
這是一個包含UNICODE格式數據的定長字元串。NCHAR欄位最多可以存儲2,000位元組的信息。它的最大長度取決於國家字元集。
1.3 VARCHAR類型
不要使用VARCHAR數據類型。使用VARCHAR2數據類型。
1.4: VARCHAR2類型
變長字元串,與CHAR類型不同,它不會使用空格填充至最大長度。VARCHAR2最多可以存儲4,000位元組的信息。
1.5: NVARCHAR2類型
這是一個包含UNICODE格式數據的變長字元串。 NVARCHAR2最多可以存儲4,000位元組的信息。
二. 數字類型
2.1 NUMBER類型
NUMBER(P,S)是最常見的數字類型,可以存放數據范圍為10130~10126(不包含此值),需要1~22位元組(BYTE)不等的存儲空間。
P 是Precison的英文縮寫,即精度縮寫,表示有效數字的位數,最多不能超過38個有效數字
S是Scale的英文縮寫,可以使用的范圍為-84~127。Scale為正數時,表示從小數點到最低有效數字的位數,它為負數時,表示從最大有效數字到小數點的位數
下面是官方文檔的示例
Actual Data Specified As Stored As
123.89 NUMBER 123.89
123.89 NUMBER(3) 124
123.89 NUMBER(6,2) 123.89
123.89 NUMBER(6,1) 123.9
123.89 NUMBER(3) 124
123.89 NUMBER(4,2) exceeds precision
123.89 NUMBER(6,-2) 100
.01234 NUMBER(4,5).01234
.00012 NUMBER(4,5) .00012
.000127 NUMBER(4,5) .00013
.0000012 NUMBER(2,7) .0000012
.00000123 NUMBER(2,7) .0000012
1.2e-4 NUMBER(2,5) 0.00012
1.2e-5 NUMBER(2,5) 0.00001
2.2 INTEGER類型
INTEGER是NUMBER的子類型,它等同於NUMBER(38,0),用來存儲整數。若插入、更新的數值有小數,則會被四捨五入。
2.3 浮點數
Oracle 資料庫提供了專為浮點數的兩種數值數據類型:
BINARY_FLOAT
BINARY_FLOAT 是 32 位、 單精度浮點數字數據類型。可以支持至少6位精度,每個 BINARY_FLOAT 的值需要 5 個位元組,包括長度位元組。
BINARY_DOUBLE
BINARY_DOUBLE 是為 64 位,雙精度浮點數字數據類型。每個 BINARY_DOUBLE 的值需要 9 個位元組,包括長度位元組。
在數字的列中,浮點數有小數精度。在 BINARY_FLOAT 或 BINARY_DOUBLE 的列中,浮點數有二進制的精度。二進制浮點數支持的特殊值無窮大和 NaN (不是數字)。
2.5 FLOAT類型
FLOAT類型也是NUMBER的子類型。
Float(n),數 n 指示位的精度,可以存儲的值的數目。N 值的范圍可以從 1 到 126。若要從二進制轉換為十進制的精度,請將 n 乘以 0.30103。要從十進制轉換為二進制的精度,請用 3.32193 乘小數精度。126 位二進制精度的最大值是大約相當於 38 位小數精度。
三. 日期類型
日期類型用於存儲日期數據,但是並不是使用一般的格式(2012-08-08)直接存儲到資料庫的。
3.1 DATE類型
DATE是最常用的數據類型,日期數據類型存儲日期和時間信息。雖然可以用字元或數字類型表示日期和時間信息,但是日期數據類型具有特殊關聯的屬性。為每個日期值,Oracle 存儲以下信息: 世紀、 年、 月、 日期、 小時、 分鍾和秒。一般佔用7個位元組的存儲空間。
3.2 TIMESTAMP類型
這是一個7位元組或12位元組的定寬日期/時間數據類型。它與DATE數據類型不同,因為TIMESTAMP可以包含小數秒,帶小數秒的TIMESTAMP在小數點右邊最多可以保留9位
3.3 TIMESTAMP WITH TIME ZONE類型
這是TIMESTAMP類型的變種,它包含了時區偏移量的值
3.4 TIMESTAMP WITH LOCAL TIME ZONE類型
3.5 INTERVAL YEAR TO MOTH
3.6 INTERVAL DAY TO SECOND
四. LOB類型
內置的LOB數據類型包括BLOB、CLOB、NCLOB、BFILE(外部存儲)的大型化和非結構化數據,如文本、圖像、視屏、空間數據存儲。BLOB、CLOB、NCLOB類型
4.1 CLOB 數據類型
它存儲單位元組和多位元組字元數據。支持固定寬度和可變寬度的字元集。CLOB對象可以存儲最多 (4 gigabytes-1) * (database block size) 大小的字元
4.2 NCLOB 數據類型
它存儲UNICODE類型的數據,支持固定寬度和可變寬度的字元集,NCLOB對象可以存儲最多(4 gigabytes-1) * (database block size)大小的文本數據。
4.3 BLOB 數據類型
它存儲非結構化的二進制數據大對象,它可以被認為是沒有字元集語義的比特流,一般是圖像、聲音、視頻等文件。BLOB對象最多存儲(4 gigabytes-1) * (database block size)的二進制數據。
4.4 BFILE 數據類型
二進制文件,存儲在資料庫外的系統文件,只讀的,資料庫會將該文件當二進制文件處理
五. RAW & LONG RAW類型
5.1 LONG類型
它存儲變長字元串,最多達2G的字元數據(2GB是指2千兆位元組, 而不是2千兆字元),與VARCHAR2 或CHAR 類型一樣,存儲在LONG 類型中的文本要進行字元集轉換。ORACLE建議開發中使用CLOB替代LONG類型。支持LONG 列只是為了保證向後兼容性。CLOB類型比LONG類型的限制要少得多。 LONG類型的限制如下:
1.一個表中只有一列可以為LONG型。(Why?有些不明白)
2.LONG列不能定義為主鍵或唯一約束,
3.不能建立索引
4.LONG數據不能指定正則表達式。
5.函數或存儲過程不能接受LONG數據類型的參數。
6.LONG列不能出現在WHERE子句或完整性約束(除了可能會出現NULL和NOT NULL約束)
5.2 LONG RAW 類型,能存儲2GB 的原始二進制數據(不用進行字元集轉換的數據)
5.3 RAW類型
用於存儲二進制或字元類型數據,變長二進制數據類型,這說明採用這種數據類型存儲的數據不會發生字元集轉換。這種類型最多可以存儲2,000位元組的信息
六. ROWID & UROWID類型
在資料庫中的每一行都有一個地址。然而,一些錶行的地址不是物理或永久的,或者不是ORACLE資料庫生成的。
例如,索引組織錶行地址存儲在索引的葉子,可以移動。
例如,外部表的ROWID(如通過網關訪問DB2表)不是標準的ORACLE的rowid。
ORACLE使用通用的ROWID(UROWIDs)的存儲地址的索引組織表和外表。索引組織表有邏輯urowids的,和國外表的外urowids。UROWID這兩種類型的存儲在ROWID偽(堆組織的表的物理行id)。
創建基於邏輯的rowid在表中的主鍵。邏輯的rowid不會改變,只要主鍵不改變。索引組織表的ROWID偽UROWID數據類型。你可以訪問這個偽列,你會堆組織表的ROWID偽(即使用一個SELECT …ROWID語句)。如果你想存儲的rowid索引組織表,那麼你就可以定義一列的表型UROWID到列檢索值的ROWID偽。
4. oracle欄位類型NUMBER(38,3),括弧中兩個數字分別表示什麼
38代表總位數 3代表小數點後面位數
number(p,s)
p:1~38
s:-84~127
p>0,對s分2種情況:1. s>0
精確到小數點右邊s位,並四捨五入。然後檢驗有效數位是否<=p;如果s>p,小數點右邊至少有s-p個0填充。
2. s<0
精確到小數點左邊s位,並四捨五入。然後檢驗有效數位是否<=p+|s|
123.2564 NUMBER 123.2564
1234.9876 NUMBER(6,2) 1234.99
12345.12345 NUMBER(6,2) Error
1234.9876 NUMBER(6) 1235
12345.345 NUMBER(5,-2) 12300
1234567 NUMBER(5,-2) 1234600
12345678 NUMBER(5,-2) Error
123456789 NUMBER(5,-4) 123460000
1234567890 NUMBER(5,-4) Error
12345.58 NUMBER(*, 1) 12345.6
0.1 NUMBER(4,5) Error
0.01234567 NUMBER(4,5) 0.01235
0.09999 NUMBER(4,5) 0.09999
(4)oracle資料庫的欄位類型擴展閱讀
ORACLE資料庫欄位類型說明:
目前Oracle資料庫大概有26個欄位類型,大體分為六類,分別是字元串類型、數字數據類型、日期時間數據類型、大型對象(LOB)數據類型、RAW和LONG RAW數據類型、ROWID和UROWID數據類型。
oracle欄位類型限制與誤區。
char(byte)
固定長度字元串 最大長度2000位元組。
varchar2(byte)
默認的表示方式,比如:varchar2(100),就相當於varchar2(100 byte),表示最大位元組數是100,該欄位最多能容納100個位元組,強調空間大小。
保存漢字等字元時,就要小心了。如果你的資料庫用的是GBK編碼,那麼一個漢字將佔用2個位元組,最多能存50個漢字,如果你的資料庫用的是UTF8編碼,那麼一個漢字將佔用3個位元組,最多能存33個漢字。
varchar2(char)
表示最大字元數是100,該欄位最多能容納100個字元,強調個數。假設varchar2(100 char),那麼無論是數字、字母、漢字,都看成一個字元,最多寫100個。
當然,漢字越多,佔用的空間越大,同樣遵循上邊的資料庫編碼原則。例如:存入一個漢字,底層佔2或3個位元組,存入一個字母,佔1個位元組。
nvarchar2()
沒有byte、char之分,類似於varchar2(char),只不過nvarchar2()屏蔽了資料庫編碼,無論是何種編碼,nvarchar2()中一個漢字都占兩個位元組。
需要注意的是:
無論是varchar2還是nvarchar2,最大位元組數都是4000.所以varchar(2000 char),當存入2000個漢字時,這時的總位元組為6000(utf-8)。
但是最大的位元組數為4000,這時多餘的位元組數就會被截取掉。
所以,對於GBK編碼的資料庫而言,安全的寫法為:varchar2(2000 char)、nvarchar2(2000),對於UTF8編碼的資料庫而言,安全的寫法為:varchar2(1333 char)、nvarchar2(2000)。
5. Oracle資料庫中什麼欄位類型能保存'0'字元
目前Oracle 資料庫大概有26個欄位類型,大體分為六類,分別是字元串類型、數字數據類型、日期時間數據類型、大型對象(LOB)數據類型、RAW和LONG RAW數據類型、ROWID和UROWID數據類型。當然Oracle還提供用戶自定義的數據類型,但在我這篇不做討論。
字元串類型
Char
char數據類型存儲固定長度的字元值。一個CHAR數據類型可以包括1到2000個字元。如果對CHAR沒有明確地說明長度,它的默認長度則設置為1。 如果對某個CHAR類型變數賦值,其長度小於規定的長度,那麼Oracle自動用空格填充。
注意:如果給了一個比固定長度更長的值,其尾部帶有空格,則空格會被刪除到固定的長度。如果值太大Oracle會返回一個錯誤,
Varchar
用於保存變長的字元串數據。其中最大位元組長度由(size)指定。每行長度可變,最大長度為每行4000位元組。設置長度(size)前需考慮字元集為單位元組或多位元組。
注意:varchar是被廢棄的類型,oracle目前都推薦使用varchar2。雖然varchar也可以用,但不確保未來的版本是否還支持
Varchar2
用於保存變長的字元串數據。其中最大位元組長度由(size)指定。每行長度可變,最大長度為每行4000位元組。設置長度(size)前需考慮字元集為單位元組或多位元組。由於VARCHAR2數據類型只存儲為該列所賦的字元(不加空格),所以VARCHAR2需要的存儲空間比CHAR數據類型要小。
區別:varchar2把所有字元都占兩位元組處理(一般情況下),varchar只對漢字和全形等字元占兩位元組,數字,英文字元等都是一個位元組;VARCHAR2把空串等同於null處理,而varchar仍按照空串處理;大部分情況下建議使用varchar2類型,可以保證更好的兼容性。
Nchar
Unicode數據類型,根據字元集而定的固定長度字元串,最大長度2000bytes。
Nvarchar2
Unicode數據類型,根據字元集而定的可變長度字元串,最大長度4000bytes。
Long
可變長字元列,最大長度限制為2GB,用於不需要作字元串搜索的長串數據。
說明:此類型是一個遺留下來的而且將來不會被支持的數據類型,逐漸被BLOB,CLOB,NCLOB等大的數據類型所取代。
數字類型
Number
NUMBER數據類型精度可以高達38位,它有兩個限定符,如:column NUMBER(precision,scale)。precision表示數字中的有效位。如果沒有指定precision的話,Oracle將使用38 作為精度。scale表示小數點右邊的位數,scale默認設置為0。如果把scale設成負數,Oracle將把該數字取捨到小數點左邊的指定位數。
Decimal
Oracle只是在語法上支持decimal類型,但是在底層實際上它就是number類型,支持decimal類型是為了能把數據從Oracle資料庫移到其他資料庫中。
Float
FLOAT類型也是NUMBER的子類型。其格式Float(n),數 n 指示位的精度,可以存儲的值的數目。N 值的范圍可以從1 到 126。若要從二進制轉換為十進制的精度,請將n 乘以 0.30103。要從十進制轉換為二進制的精度,請用 3.32193乘小數精度。126 位二進制精度的最大值是大約相當於 38 位小數精度。
BINARY_FLOAT
BINARY_FLOAT 是一種 32 位,單精度浮點數字數據類型。每個 BINARY_FLOAT 值需要5 位元組存儲空間,其中 1位元組用於存儲數據值的長度。支持 NUMBER 數據類型所提供的基本功能。但採用二進制精度,而NUMBER 採用十進制精度。因此能夠提供更快的數學運算速度,且能減少佔用的存儲空間。
BINARY_DOUBLE
BINARY_DOUBLE 是一種 64 位,雙精度浮點數字數據類型。每個 BINARY_DOUBLE 值需要9 位元組存儲空間,其中1 位元組用於存儲數據值的長度。支持 NUMBER 數據類型所提供的基本功能。但採用二進制精度,而NUMBER 採用十進制精度。因此能夠提供更快的數學運算速度,且能減少佔用的存儲空間。
日期數據類型
Date
ORACLE最常用的日期類型,它可以保存日期和時間,常用日期處理都可以採用這種類型。DATE表示的日期范圍可以是公元前4712年1月1日至公元9999年12月31日。
date類型在資料庫中的存儲固定為7個位元組, 第1位元組:世紀+100、 第2位元組:年、第3位元組:月、第4位元組:天、第5位元組:小時+1、第6位元組:分+1、第7位元組:秒+1。
Timestamp
ORACLE常用的日期類型,它與date的區別是不僅可以保存日期和時間,還能保存小數秒,小數位數可以指定為0-9,默認為6位,所以最高精度 可以到ns(納秒),資料庫內部用7或者11個位元組存儲,如果精度為0,則用7位元組存儲,與date類型功能相同,如果精度大於0則用11位元組存儲。第1位元組:世紀+100、第2位元組:年、第3位元組:月、第4位元組:天、 第5位元組:小時+1、第6位元組:分+1、第7位元組:秒+1、 第8-11位元組:納秒,採用4個位元組存儲,內部運算類型為整形
註:TIMESTAMP日期類型如果與數值進行加減運算會自動轉換為DATE型,也就是說小數秒會自動去除。
TIMESTAMP WITH TIME ZONE
對TIMESTAMP進行了擴展,用於存儲時區。時間戳以及時區位移值,其中fractional_seconds_precision是數字在第二日期時間欄位的小數部分數字的所有值。可接受的值是0到9。默認是6。默認格式是確定明確的NLS_DATE_FORMAT參數或隱式的NLS_TERRITORY參數。大小固定為13位元組。此數據類型包含日期時間欄位YEAR,MONTH,日,小時,分鍾,秒TIMEZONE_HOUR和TIMEZONE_MINUTE。它有一個明確的分數秒和時區。
TIMESTAMP WITH LOCAL TIME ZONE
所有的TIMESTAMP WITH TIME ZONE值,但下列情況除外:數據標准化資料庫的時區時,存儲在資料庫中。當數據被檢索,用戶可以看到在會話時區中的數據。
默認格式是確定明確的NLS_DATE_FORMAT參數或隱式的NLS_TERRITORY參數。的大小不同的7至11個位元組,取決於精度。
INTERVAL YEAR TO MONTH
存儲期間年數和月的時間,其中year_precision是數字的年份日期時間欄位的數量。可接受的值是0到9。默認是2。大小固定為5個位元組。
INTERVAL DAY TO SECOND
其格式為:INTERVAL DAY [(day_precision)] TO SECOND [(fractional_seconds)],是存儲一段時間以天,小時,分鍾和秒,其中day_precision是數字在DAY日期時間欄位的最大數量。可接受的值是0到9。默認是2。fractional_seconds_precision是數字中的第二個欄位的小數部分的數量。可接受的值是0到9。默認是6。大小固定為11個位元組。
INTERVAL YEAR TO MONTH
Oracle語法:INTERVAL YEAR [(year_precision )] TO MONTH,用來表示一段時間差, 只精確到年和月. year_precision是數字年的時間段,接受的值為0到9。默認值是2。大小固定為5個位元組。
大型對象(LOB)數據類型
Clob
最大4G,存儲單位元組字元型數據。適用於存儲超長文本。
Nclob
最大4G,存儲多位元組國家字元型數據。適用於存儲超長文本。
Blob
最大4G,存儲二進制數據。適用於存儲圖像、視頻、音頻等。
BFile
最大長度是4GB,在資料庫外部保存的大型二進制對象文件,最大長度是4GB。這種外部的LOB類型,通過資料庫記錄變化情況,但是數據的具體保存是在資料庫外部進行的。 Oracle 可以讀取、查詢BFILE,但是不能寫入,不參與事務。
RAW和LONG RAW數據類型
RAW
raw(n)格式,其中n=1 to 2000,可變長二進制數據,在具體定義欄位的時候必須指明最大長度n,Oracle 用這種格式來保存較小的圖形文件或帶格式的文本文件,如Miceosoft Word文檔。raw是一種較老的數據類型,將來會逐漸被BLOB、CLOB、NCLOB等大的對象數據類型所取代。
LONG RAW
最大長度是2GB。可變長二進制數據,最大長度是2GB。Oracle 用這種格式來保存較大的圖形文件或帶格式的文本文件,如Miceosoft Word文檔,以及音頻、視頻等非文本文件。在同一張表中不能同時有long類型和long raw類型,long raw也是一種較老的數據類型,將來會逐漸被BLOB、CLOB、NCLOB等大的對象數據類型所取代。
ROWID和UROWID數據類型
Rowid
ROWID為該錶行的唯一標識,是一個偽列,可以用在SELECT中,但不可以用INSERT, UPDATE來修改該值。ROWID列,Oracle使用ROWID列來建立內部索引。你可以引用ROWID的值,但ROWID並不存放在資料庫中,你可以創建一個表包含ROWID數據類型。但Oracle不保證該值是合法的rowids。用戶必須確保該rowid值是真實合法的。
Urowid
UROWID支持邏輯和物理的rowids,列UROWID類型可以存儲各種rowids, 從8.1以後的Oracle才有UROWID類型,它也可以用來保存以前的ROWID類型數據信息。
特殊數據類型
Xmltype
XMLType是Oracle從9i開始特有的數據類型,是一個繼承了Blob的強大存在,可以用來存儲xml並提供了相當多的操作函數,用來直接讀取xml文檔和管理節點。理論上可以保存2G大小的數據。作為XML數據的特殊存儲類型。Xmltype提供了適合的保存、檢索和操作的支持。
Xmlindex
XMLIndex 索引可用於 SQL/XML 函數 XMLExists()、XMLTable() 和 XMLQuery(),而且它在查詢的任何部分都有效;它並不限於用在 WHERE 子句中。而您可能用於 XML 數據的其他任何索引都無法做到這一點。
XMLIndex 因此可提高對 SELECT 列表數據和 FROM 列表數據的訪問速度,對 XML 片段提取尤為有用。基於函數的索引和 CTXXPath 索引。您無需預先了解將在查詢中使用的XPath 表達式。XMLIndex 完全是通用的,而基於函數的索引則不同。可將 XMLIndex 索引用於基於 XML 模式或非基於模式的數據。它可用於二進制 XML 和非結構化存儲模型。B 樹索引僅適用於以對象關系方式存儲(結構化存儲)的基於模式的數據;它對於存儲在二進制XML 或CLOB 實例中的基於 XML 模式的數據效率低下。可使用 XMLIndex 索引通過 XPath 表達式進行搜索,這些表達式的目標是集合(即文檔中出現多次的節點)。而函數索引則不然。