ホームページ >バックエンド開発 >PHPチュートリアル >mysqlのfloat型は非常に奇妙です
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 しか保存できません