この節は、以下の主題を中心にして、MySQL
5.1 内における
DECIMAL
データ型 (およびその同義語)
の持つ特徴について説明しています。
最大桁数
ストレージフォーマット
ストレージ要件
DECIMAL
カラムの上部に対する非スタンダード MySQL
拡張子
MySQL の古いバージョン用に書かれたアプリケーションに適合しない可能性のある問題については、この節全体で指摘されます。
DECIMAL
カラムに対する宣言構文は
DECIMAL(
です。MySQL 5.1
における引数値の範囲は次のとおりです:
M
,D
)
M
は最大桁数 (精度)
です。それには 1 から 65
までの範囲が含まれています。(古いバージョンの
MySQL では、1 から 254
までの範囲が許容されています)。
D
は小数点 (スケール)
の右側にある数字の桁数です。それは 0 から
30 までの範囲であり、M
より広くてはいけません。
M
に対する最大値が 65
であることは、DECIMAL
値に関する計算が 65
桁まで正確であることを意味します。精度を 65
桁とするこの限界は正確値数値リテラルにも適用されるので、このようなリテラルの最大範囲は以前とは異なります。(古いバージョンの
MySQL では、10 進法の値を最高 254
桁まで持つことができました。しかし、計算は浮動小数点を使って実行されていたので、結果は正確でなく、近似値でした)。
MySQL 5.1
では、DECIMAL
カラムのための値は、4 バイトの中に 9 個の 10
進数をパックするバイナリフォーマットを使って格納されます。各値の整数部と端数部に対する格納要件は別々に決定されます。9
桁の倍ごとに 4 バイト、残りの桁には 4
バイトの一部の容量がそれぞれ必要です。残りの桁に必要な格納容量を以下のテーブルに列記します.
余り桁数 | バイト数 |
0 | 0 |
1 | 1 |
2 | 1 |
3 | 2 |
4 | 2 |
5 | 3 |
6 | 3 |
7 | 4 |
8 | 4 |
9 | 4 |
たとえば、DECIMAL(18,9)
カラムの桁数は小数点のどちらの側も 9
桁なので、整数部分と端数部分にはそれぞれ 4
バイトずつ必要です。DECIMAL(20,6)
カラムの整数部分は 14 桁、小数部分は 6
桁です。整数桁では、9 桁分の 4 バイトと残り 5
桁分の 3 バイトが必要になります。小数 6
桁には 3 バイトが必要となります。
(5.0.3 より前の) 古いバージョンの MySQL
とは異なり、MySQL 5.1 内の
DECIMAL
カラムは、先頭の +
キャラクタや -
キャラクタ、あるいは先頭の
0
の桁を格納しません。
DECIMAL(5,1)
カラムの中に +0003.1
を挿入すると、それは
3.1
と格納されます。負の数では、リテラルの
-
キャラクタは格納されません。古い性能に依存するアプリケーションはこの変更を考慮するように改良を施さなければなりません。
MySQL 5.1 における
DECIMAL
カラムは、カラムの定義に規定する範囲を超える大きい値を容認しません。たとえば、DECIMAL(3,0)
カラムは -999
から
999
までの範囲をサポートしています。
DECIMAL(
カラムは小数点の左側に最大
M
,D
)M
- D
桁を容認します。これは
+
サインの代わりに余分な桁を格納することを許容している
MySQL
のもっと古いバージョンのアプリケーションには対応できません。
SQL
スタンダードは、NUMERIC(
の精度が正確に
M
,D
)M
桁であることを要求しています。
DECIMAL(
に対して、スタンダードは少なくとも
M
、D
)M
桁の精度を要求していますが、それ以上でも容認されます。MySQL
の場合、DECIMAL(
並びに M
,D
)NUMERIC
(
は同じで、両方共正確に M
,D
)M
桁の精度を持っています。
DECIMAL
データ型の古い処理に依存しているアプリケーションのポーテングに関する詳細情報については、MySQL
5.0 Reference Manual をご参照ください。