數值類型 - Amazon Redshift

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

數值類型

數值資料類型包括整數、小數和符點數。

整數類型

使用 SMALLINT、INTEGER 和 BIGINT 資料類型來儲存各種範圍的整數。您不能儲存超出每種類型允許範圍的值。

名稱 儲存 範圍
SMALLINT 或 INT2 2 位元組 -32768 到 +32767
INTEGER、INT 或 INT4 4 位元組 -2147483648 到 +2147483647
BIGINT 或 INT8 8 位元組 -9223372036854775808 到 9223372036854775807

DECIMAL 或 NUMERIC 類型

使用 DECIMAL 或 NUMERIC 資料類型,以使用者定義的精確度來儲存數值。DECIMAL 和 NUMERIC 關鍵字可互換使用。在本文件中,小數是此資料類型的首選用詞。數值一詞通常是用來指稱整數、小數和浮點資料類型。

儲存 範圍
變數,未壓縮的 DECIMAL 類型最多 128 位元。 128 位元帶正負號的整數,具備最高 38 個位數的精確度。

藉由指定 precisionscale,來定義資料表中的 DECIMAL 欄:

decimal(precision, scale)
precision

整個值中有效位數的總數:小數點兩邊的位數數量。例如,數字 48.2891 的精確度 (有效位數) 為 6,小數位數為 4。如果未指定,預設的精確度為 18,最高精確度為 38。

如果在輸入值中,小數點左邊的位數數目,超過資料欄的精確度減去其小數位數,就無法將此值複製 (或插入或更新) 到資料欄中。此規則適用於超出資料欄定義範圍之外的任何值。例如,numeric(5,2) 欄的值,其允許的範圍為 -999.99999.99

scale

數值小數部分中,位於小數點右邊的小數位數數目。整數的小數位數為 0。在資料欄的規格中,小數位數的值必須小於或等於精確度的值。如果未指定,預設的小數位數為 0,最大的小數位數為 37。

如果載入資料表的輸入值,其小數位數大於資料欄的小數位數,則此值會四捨五入至指定的小數位數。例如,SALES 資料表中的 PRICEPAID 資料欄為 DECIMAL(8,2) 資料欄。如果將 DECIMAL(8,4) 值插入 PRICEPAID 資料欄,會將此值四捨五入為 2 個小數位數。

insert into sales values (0, 8, 1, 1, 2000, 14, 5, 4323.8951, 11.00, null); select pricepaid, salesid from sales where salesid=0; pricepaid | salesid -----------+--------- 4323.90 | 0 (1 row)

不過,從資料表所選取值的明確轉換結果,不會四捨五入。

注意

可以插入 DECIMAL(19,0) 資料欄的正數值上限為 9223372036854775807 (263 -1)。負數值上限為 -9223372036854775807。例如,如果試圖插入數值 9999999999999999999 (19 個 9),將會造成溢位錯誤。無論小數點的位置何在,Amazon Redshift 可以表示為 DECIMAL 數值的最大字串是9223372036854775807。例如,可以載入 DECIMAL(19,18) 資料欄的最大值為 9.223372036854775807。這些規則源自於在內部將 DECIMAL 數值儲存為 8 位元組整數。除非此等精確度為必要,否則不要使用 19 個位數的精確度來定義 DECIMAL 數值,除非此等精確度為必要。

關於使用 128 位元 DECIMAL 或 NUMERIC 資料欄的備註

除非您確定自己的應用程式需要此等精確度,否則不要隨意地將 DECIMAL 資料欄指定為最高精確度。128 位元的值所使用的磁碟空間是 64 位元數值的兩倍,並會減慢查詢作業的執行時間。

浮點類型

使用 REAL 和 DOUBLE PRECISION 資料類型,以可變精確度來儲存數值。這些是不精確的類型,代表某些數值會以近似值儲存,因此在儲存和傳回特定值時,可能會造成些微的出入。如果您需要精確的儲存和計算 (例如貨幣金額),請使用 DECIMAL 資料類型。

名稱 儲存 範圍
REAL 或 FLOAT4 4 位元組 6 個有效位數的精確度
DOUBLE PRECISION、FLOAT8 或 FLOAT 8 位元組 15 個有效位數的精確度

例如,請注意下列將數值插入 REAL 資料欄的結果:

create table real1(realcol real); insert into real1 values(12345.12345); insert into real1 values(123456.12345); select * from real1; realcol --------- 123456 12345.1 (2 rows)

這些插入的數值會被截斷,以符合 REAL 資料欄 6 個有效位數精確度的限制。