本節討論 DECIMAL
資料類型 (及其同義詞) 的特性,特別是關於以下主題
最大位數
儲存格式
儲存需求
MySQL 對於
DECIMAL
資料行上限範圍的非標準擴充
用於 DECIMAL
資料行的宣告語法是 DECIMAL(
。引數的值範圍如下M
,D
)
M
是最大位數 (精確度)。其範圍為 1 到 65。D
是小數點右邊的位數 (小數位數)。其範圍為 0 到 30,且不得大於M
。
如果省略 D
,則預設值為 0。如果省略 M
,則預設值為 10。
M
的最大值 65 表示 DECIMAL
值的計算精確度最高可達 65 位數。此 65 位數精確度的限制也適用於精確值數值常值,因此此類常值的最大範圍與之前不同。(對於 DECIMAL
常值的文字長度也有限制;請參閱 章節 14.24.3,「表達式處理」。)
DECIMAL
資料行的值會以二進位格式儲存,該格式將 9 個十進位數字壓縮到 4 個位元組中。每個值的整數和小數部分所需的儲存空間是分開決定的。每 9 個數字的倍數需要 4 個位元組,而任何剩餘的數字則需要 4 個位元組的一部分。剩餘數字所需的儲存空間由下表給出。
剩餘數字 | 位元組數 |
---|---|
0 | 0 |
1–2 | 1 |
3–4 | 2 |
5–6 | 3 |
7–9 | 4 |
例如,DECIMAL(18,9)
資料行在小數點的任一側都有 9 個數字,因此整數部分和小數部分各需要 4 個位元組。DECIMAL(20,6)
資料行有 14 個整數位數和 6 個小數位數。整數位數中的 9 個數字需要 4 個位元組,而剩餘的 5 個數字需要 3 個位元組。6 個小數位數需要 3 個位元組。
DECIMAL
資料行不會儲存開頭的 +
字元或 -
字元或開頭的 0
數字。如果將 +0003.1
插入到 DECIMAL(5,1)
資料行中,則會以 3.1
的形式儲存。對於負數,不會儲存常值 -
字元。
DECIMAL
資料行不允許值大於資料行定義所暗示的範圍。例如,DECIMAL(3,0)
資料行支援的範圍為 -999
到 999
。DECIMAL(
資料行允許小數點左邊最多有 M
,D
)M
- D
個位數。
SQL 標準要求 NUMERIC(
的精確度必須完全是 M
,D
)M
位數。對於 DECIMAL(
,標準要求精確度至少為 M
,D
)M
位數,但允許更多位數。在 MySQL 中,DECIMAL(
和 M
,D
)NUMERIC(
是相同的,並且兩者的精確度都正好是 M
,D
)M
位數。
如需 DECIMAL
值內部格式的完整說明,請參閱 MySQL 原始碼發行版中的 strings/decimal.c
檔案。格式在 decimal2bin()
函式中說明(並提供範例)。