本節討論 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() 函式中說明(並提供範例)。