數字型包含4位元組整數、4位元組和8位元組浮點數以及固定精度的小數。
在下面的表中列出了可以使用的數字型。
名稱 | 儲存空間 | 描述 | 範圍 |
BINARY INTEGER | 4 bytes | 有符號整數,integer的別名。 | -2,147,483,648到+2,147,483,647 |
DOUBLE PRECISION | 8 bytes | 可變精度,不精確。 | 15位小數精度 |
INTEGER | 4 bytes | 整數的常規選擇。 | -2,147,483,648到+2,147,483,647 |
NUMBER | Variable | 使用者指定的精度,精確。 | 精度高達1000位 |
NUMBER(p [, s ] ) | Variable | 最大精度p和可選刻度s的精確數字。 | 精度高達1000位 |
PLS INTEGER | 4 bytes | 有符號整數,integer的別名。 | -2,147,483,648到+2,147,483,647 |
REAL | 4 bytes | 可變精度,不精確。 | 6位小數精度 |
ROWID | 8 bytes | 帶符號的8位整數。 | -9223372036854775808到9223372036854775807 |
SMALLINT | 2 bytes | 小範圍整數。 | -32768到+32767 |
BIGINT | 8 bytes | 大範圍整數。 | -9223372036854775808到+9223372036854775807 |
DECIMAL | 可變長 | 使用者指定的精度,精確。 | 小數點前131072位到小數點後16383位 |
NUMERIC | 可變長 | 使用者指定的精度,精確。 | 小數點前131072位到小數點後16383位 |
SMALLSERIAL | 2 bytes | 2位元組。 | 1到32767 |
SERIAL | 4 bytes | 自增整數。 | 1到2147483647 |
BIGSERIAL | 8 bytes | 自增的大範圍整數。 | 1到9223372036854775807 |
在下面的章節中會詳細介紹這些資料類型。
整數類型
類型INTEGER儲存整個數值(不帶有小數部分),數值區間為-2,147,483,648到+2,147,483,647。 如果嘗試儲存超出允許範圍的數值,將會產生錯誤。
一般只有在磁碟空間緊張時才使用SMALLINT。 當INTEGER的取值範圍不足時才使用BIGINT。
類型ROWID的列儲存固定長度的位元據,這些資料描述了一個記錄的實際地址。類型ROWID是一個無符號的、4位元組的INTEGER,能夠儲存整個數值(不帶有小數部分),數值區間為0 和 4,294,967,295。如果嘗試儲存超出允許範圍的數值,將會產生錯誤。
帶有任意精度的數值
NUMBER類型能夠用於儲存對於精度位元沒有限制的數字,並且可以用於執行精確計算。當要求高精確度時,推薦使用這種類型來儲存貨幣總量和其他類型的數量值。但是與下一章節中介紹的浮點類型相比,對於NUMBER類型數值的計算速度很慢。
下面是我們所使用的術語:NUMBER類型數值的範圍是小數點右邊部分的小數位元。NUMBER類型數值的精度是指整個數值包含的所有數字,也就是小數點左右兩邊的所有數字。所以,我們可以說數值23.5141的精度為6,範圍是4。我們可以認為整數的範圍是0。
NUMBER類型數值的精度和範圍是可以配置的。通過使用下面所示的文法,可以把列的資料類型聲明為NUMBER。
NUMBER(precision, scale)精度必須為正數,範圍可以是0或正數,我們也可以採用如下方法聲明:
NUMBER(precision)指定數值範圍為0。而通過將列指定為不帶任意精度和範圍的NUMBER類型,可以列中儲存任意精度和範圍的數值,其中精度值可達到實際應用的上限。這種類型的列將不會把輸入值強製為轉換為任意特定的範圍。如果列的資料類型是帶有範圍的NUMBER類型,那麼會強制把輸入值的範圍轉換為指定範圍。(SQL標準中要求預設的範圍值為0,例如:強制指定數值的精度為整數的精度,從最方便使用的角度考慮,最好明確地指定精度和範圍)。
如果數值的精度或者範圍大於列的資料類型所聲明的精度和範圍,那麼系統將會試圖對這個值進行四捨五入。如果不能對數值進行四捨五入的處理來滿足資料類型的限制,則會產生一個錯誤。
NUMERIC、DECIMAL兩種資料類型和NUMBER是等效的。
浮點類型
資料類型REAL和 DOUBLE PRECISION屬於非精確,可變精度的數實值型別。實際上,這些類型通常是對於二進位浮點算術(分別是單精確度和雙精確度)的IEEE標準754的具體實現,在一定範圍內由特定的處理器,作業系統和編譯器所支援。
非精確的含義是不能將一些數值精確地轉換成內部格式,並且這些數值只能以近似值的形式儲存。
所以在儲存和列印出的這類數值時可能有一點差異。對這些錯誤進行管理以及這些錯誤如何在整個計算過程中傳遞是整個數學和電腦科學的分支需要研究的課題,除了以下幾點,其餘將不做更進一步的討論。
如果要求精確儲存和計算數值(例如貨幣總量),可以使用NUMBER類型。
如果您想用這些資料類型對重要的資料進行複雜計算,特別是當必須依靠在邊界情況(無窮大,下溢)的特定行為時,應該仔細評估相關的實現方法。
比較兩個浮點類型的值可能不會得到預想的結果。在大多數平台上,REAL類型數值的範圍是1E-37到1E+37,精度至少是6個小數位。DOUBLE PRECISION的範圍通常是1E-307 到1E+308,精度至少是15位。太大或者太小的值都會引發錯誤。如果輸入數值的精度太高的話,就會發生四捨五入的操作。太小接近於零的數值無法與零區分開,將會產生一個下溢的錯誤。
PolarDB同樣也支援標準 SQL文法的FLOAT和FLOAT(P), 這樣可以指定非精確數實值型別。在這裡P指定在位元字中可接受的最小精度。PolarDB把從FLOAT(1)到FLOAT(24)的資料類型當作REAL類型,把從FLOAT(25)到FLOAT(53)的資料類型當作DOUBLE PRECISION類型。超出允許範圍的P值會引發一個錯誤。沒有指定精度的浮點數被當成DOUBLE PRECISION類型。
序號類型
SMALLSERIAL、SERIAL和BIGSERIAL不是真正的數字類型,只是為在表中建立唯一標識做的概念上的便利。類似其它一些資料庫中AUTO_INCREMENT屬性,可以通過以下語句實現:
CREATE TABLE tablename (
colname SERIAL
);等價於以下幾條語句:
CREATE SEQUENCE tablename_colname_seq;
CREATE TABLE tablename (
colname integer NOT NULL DEFAULT nextval('tablename_colname_seq')
);
ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname;因此,我們便建立了一個整數欄位並且將它的預設數值安排為從一個序列發生器讀取。 應用了一個NOT NULL約束以確保NULL不會被插入。 在大多數情況下可以附加一個UNIQUE或PRIMARY KEY約束避免意外地插入重複的數值,但這個不是自動的。最後, 將序列發生器"從屬於"那個欄位,這樣當該欄位或表被刪除時也一併刪除它。
因為SMALLSERIAL、SERIAL和BIGSERIAL是使用序列實現的,所以列中的值,即使沒有刪過,也有可能出現不連續的情況。 即使從未成功將包含序列分配值的行插入表列,也仍會消耗從序列中分配的值。例如,如果插入交易回復,可能會出現這種情況。
在SERIALl欄位中插入序列中的下一個數值,需要給SERIAL欄位賦予預設值。我們可以通過在INSERT語句中把該欄位排除在欄位列表之外來實現,也可以通過使用DEFAULT關鍵字來實現。
類型名SERIALl和SERIALl4是等效的: 兩者都建立INTEGER欄位。類型名BIGSERIAL和SERIALl8是等效的,只不過BIGSERIAL會建立一個BIGINT欄位。 如果在表的生存期中使用的標識數目可能超過231個, 則應該使用BIGSERIAL。類型名SMALLSERIAL和SERIAL2是等效的,只不過SMALLSERIAL會建立一個SMALLINT欄位。
一個SERIAL類型建立的序列在所屬的欄位被刪除時會自動刪除。 您可以只刪除序列而不刪除欄位,不過這將刪除該欄位的預設值運算式。