MySQL DECIMALの使用方法


177

MySQLの10進数を完全に理解できません。行に00.0001から99.9999までの数を含めることができるようにする必要があります。このように機能するように構造化するにはどうすればよいですか?



4
あなたは本当に正しい答えを受け入れる必要があります。現在受け入れられている答えは間違っています。
Olhovsky

2
ここで終わり、10進数の符号なしは不可能であると主張する答えを読んでください。これに対する正しい仕様については、以下の新しい答えを参照してください。
Markus AO

回答:


439

DOUBLE列はDECIMAL列と同じではないため、財務データにDOUBLE列を使用すると問題が発生します。

DOUBLEは実際にはFLOATの倍精度(32ビットではなく64ビット)バージョンです。浮動小数点数は実数のおおよその表現ですあり、正確ではありません。実際、0.01のような単純な数値は、FLOAT型またはDOUBLE型では正確に表現されません。

DECIMAL列は正確な表現ですが、可能な数値の範囲がはるかに狭いため、より多くのスペースを必要とします。要求したように0.0001から99.9999までの値を保持できる列を作成するには、次のステートメントが必要です。

CREATE TABLE your_table
(
    your_column DECIMAL(6,4) NOT NULL
);

列の定義はDECIMAL(M、D)という形式に従います。ここで、Mは最大桁数(精度)で、Dは小数点の右側の桁数(スケール)です。

つまり、前のコマンドは、-99.9999〜99.9999の値を受け入れる列を作成します。0.0000〜99.9999の範囲のUNSIGNED DECIMAL列を作成することもできます。

MySQL DECIMALの詳細については、公式ドキュメントは常に優れたリソースです。

この情報はすべて、MySQL 5.0.3以降のバージョンに当てはまることを覚えておいてください。以前のバージョンを使用している場合は、本当にアップグレードする必要があります。


17
回答に投票しました。あなたの答えは正しいですが、他の答えは正しくありません(「double = decimal」と主張されているため)。DECIMALは正確な値を持つ固定小数点型であり、その同義語はNUMERIC、DEC、およびFIXEDです。DOUBLEは、近似数値データ値を表す浮動小数点型であるため、DOUBLEではありません。DECIMAL(<1-65>、<0-30>)を使用する場合、最初のパラメーターは桁数、2番目は小数点の右側の桁数です。
Norbertは

2
はい、そうです。これは、MySQL 5.0.3以降の場合はdev.mysql.com/doc/refman/5.1/en/precision-math-examples.html
ajreal

1
ポスターは、0.0001〜99.9999の値を保持する10進数フィールドを要求しました。作成したフィールドが実際に-99.9999から99.9999までの値をサポートすることを明確にするために、いくつかの追加情報を追加しました。フィードバックをお寄せいただきありがとうございます!MySQLバージョンの免責事項も追加されました。
Alex Recarey 2013年

1
「「署名されていない」DECIMAL列を作成する方法はありません」とおっしゃっていましたが、コード例は「DECIMAL(6,4)UNSIGNED NOT NULL」を示しています。どうしてこれなの?
リャン2014

3
@AlexRecarey DECIMAL UNSIGNEDをうまく作成できるようです。MySQL 5.xのマニュアルも同意しますDECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]。負の値の場合、範囲外のエラーが返されます。同様に、符号なしFLOATおよびDOUBLEを作成できます。マニュアル:dev.mysql.com/doc/refman/5.0/en/numeric-type-overview.html
Markus AO

67

上記の答えは正しいようですが、それがどのように機能するかを理解するための簡単な説明です。

列がに設定されているとしますDECIMAL(13,4)。これは、列の合計サイズが13桁になることを意味し、そのうち4桁は精度表現に使用されます。

つまり、要約すると、その列の最大値は次のようになります。 999999999.9999


1
ここでのベストアンサー
Julian Silvestri

15

コメントには正しい解決策がありますが、それらを単一の回答に要約するには:

DECIMAL(6,4)を使用する必要があります。

次に、小数点の前に2つ、小数点の後に4つ(スケール)の合計6桁の数字を使用できます。よると、少なくともこれ


6

MySQL 5.xのdecimalデータ型の仕様は次のとおりDECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]です。上記の答えは、符号なし10進数は不可能であると言っているのは誤りです。

符号なし10進数のみを許可するフィールドを定義するには、合計6桁(うち4桁は10進数)を使用します。 DECIMAL (6,4) UNSIGNED。。

同様に、符号なし(つまり、負ではない)FLOATおよびDOUBLEデータ型を作成できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.