このセクションでは、MySQL 5.6 での DECIMAL
データ型 (およびそのシノニム) の特性について、特に次のトピックに注意を払いながら説明します。
最大桁数
ストレージフォーマット
ストレージ要件
DECIMAL
カラムの上限への非標準の MySQL 拡張。
このセクション全体を通して、古いバージョン (5.0.3 より前) の MySQL のために記述されたアプリケーションとの非互換性の可能性が記載されています。
DECIMAL
カラムの宣言構文は、DECIMAL(
です。MySQL 5.6 での引数の値の範囲は次のとおりです。
M
,D
)
M
は、最大桁数 (精度) です。その範囲は 1 から 65 までです。(古いバージョンの MySQL では 1 から 254 までの範囲が許可されました。)D
は、小数点の右側の桁数 (スケール) です。その範囲は 0 から 30 までであり、M
より大きくすることはできません。
M
が 65 の最大値である場合は、DECIMAL
値に対する計算が 65 桁まで正確であることを示します。この 65 桁の精度の制限は厳密値数値リテラルにも適用されるため、このようなリテラルの最大範囲は以前とは異なります。(古いバージョンの MySQL では、10 進数値の最大桁数は 254 でした。ただし、計算は浮動小数点を使用して実行されたために厳密値ではなく、近似値でした。)
MySQL 5.6 での DECIMAL
カラムの値は、9 桁の 10 進数が 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 バイトが必要です。
一部の古いバージョンの MySQL とは異なり、MySQL 5.6 での DECIMAL
カラムには、先頭の +
文字や -
文字、または先頭の 0
の桁が格納されません。DECIMAL(5,1)
カラムに +0003.1
を挿入すると、それは 3.1
として格納されます。負の数の場合、リテラルの -
文字は格納されません。古い動作に依存するアプリケーションは、この変更が反映されるように変更する必要があります。
MySQL 5.6 での 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 ソース配布内のファイル strings/decimal.c
を参照してください。この形式は、decimal2bin()
関数で (例を使用して) 説明されています。
DECIMAL
データ型の古い処理に依存するアプリケーションの移植の詳細は、『MySQL 5.0 リファレンスマニュアル』を参照してください。