ホームページ >バックエンド開発 >PHPチュートリアル >mysqlのfloat型は非常に奇妙です

mysqlのfloat型は非常に奇妙です

WBOY
WBOYオリジナル
2016-06-23 13:55:50720ブラウズ

3 つのフィールドがあるテーブル テストがあります。
uid、1、2、uid は int 型、自動インクリメント、1 つのフィールドは float(3,2)、2 つのフィールドは float(5,2) です。理由としては 1 つのフィールドでは、123.12 のような数字、つまり最初の 3 桁と最後の 2 桁を挿入できます
2 つのフィールドでは、最初の 5 桁と最後の 2 桁を挿入できますが、 insert a

insert into test names(null,123.12 ,12345.12) 挿入は成功しましたが、表示されるデータが異なります。これはなぜですか?


という値 98.12、つまり最初の 2 桁を挿入する必要がある場合。 2 つの小数点については、このフィールドを float 型に設定する必要がありますか? D)、REAL(M,D)、または DOUBLE PRECISION(M,D)。ここで、「(M,D)」とは、小数点以下D桁の合計M桁の整数を表示する値を意味します。たとえば、FLOAT(7,4) として定義された列は、-999.9999 と表示される可能性があります。 MySQL は保存時に値を四捨五入するため、FLOAT(7,4) カラムに 999.00009 を挿入すると、おおよその結果は 999.0001 になります。

2. 精度要件がある場合は、

DECIMAL 型と NUMERIC 型を使用する必要があります。MySQL では、DECIMAL 型と NUMERIC 型は同じ型とみなされます。これらは、通貨データなど、正確な精度が必要な値を保持するために使用されます。この型の列を宣言する場合、精度と位取りを指定できます (通常はそうします)。例:

給与 DECIMAL(5,2) この例では、5 が精度、2 が位取りです。精度は値を保存できる桁数を示し、スケールは小数点以下の桁数を保存できます。


1. 定義が間違っています
MySQL では、FLOAT(M,D)、REAL(M,D)、DOUBLE PRECISION(M,D) などの非標準構文の使用が許可されています。ここで、「(M,D)」とは、小数点以下D桁の合計M桁の整数を表示する値を意味します。たとえば、FLOAT(7,4) として定義された列は、-999.9999 と表示される可能性があります。 MySQL は保存時に値を四捨五入するため、FLOAT(7,4) カラムに 999.00009 を挿入すると、おおよその結果は 999.0001 になります。

2. 精度要件がある場合は、
DECIMAL 型と NUMERIC 型を使用する必要があります。MySQL では、DECIMAL 型と NUMERIC 型は同じ型とみなされます。これらは、通貨データなど、正確な精度が必要な値を保持するために使用されます。この型の列を宣言する場合、精度と位取りを指定できます (通常はそうします)。例:
給与 DECIMAL(5,2)
この例では、5 が精度、2 が位取りです。精度は値を保存できる桁数を示し、スケールは小数点以下の桁数を保存できます。

わかりました、ありがとう Xu Ban。たとえば、通貨を保存する場合、それは正の数である必要があり、負の数にすることはできません。データベース内で直接制限することも、PHP の正規化を通じて制限することもできます。 -91.22 などの負の数値を直接挿入してみました。mysql は正の数値の格納を制限できますか?


給与 DECIMAL(5,2) のようなフィールドには値、つまり最大桁数が挿入されます。 3 桁の後に 2 桁が続く場合は、次のようになります。たとえば、123456 を入力しても機能しません。これは 5 桁ですが、その後に小数点以下 2 桁がありません。



DECIMAL(5,2) に保存された 123456 は 12345.00 です。 もちろん境界を越えます。
DECIMAL(5,2) は -999.99 ~ 999.99 しか保存できません


通貨を保存するときは、正の数値を使用する必要があります。理由は
マイナスの数字ですか?負債を示します

正の数を制限するには、UNSIGNED 属性を設定する必要があります。

を表すには 10 進フィールドを使用することをお勧めします
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。