web-dev-qa-db-ja.com

MySQLデータベースにDECIMALを挿入する方法

いくつかのフィールドを持つデータベーステーブルがあり、そのうちの1つであるcostDECIMALデータ型に設定されています。パラメーターを4,2に設定します。これにより、小数点の前に4桁、その後に2桁の数字が許可されます。

(ここで4は合計金額であり、2は小数点以下の金額であると言われましたが、誰かがそれを補足してください。)

POSTリクエスト)(たとえば、値3.80)を介してデータを挿入すると、データベースに保存されるデータは実際には99.99です。

これを引き起こすために何が間違っていますか?

表は次のとおりです。

CREATE TABLE IF NOT EXISTS `mytable` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(256) NOT NULL,
`cost` decimal(4,2) NOT NULL,
PRIMARY KEY (`id`)
)

追加クエリは次のとおりです。

INSERT INTO mytable (`id`,`title`,`cost`) 
VALUES (0, 'test title', '3.80')

更新:4,2から6,2に変更した後に動作します

26
Alex

MySqlの10進型は、小数点の左と右よりも少し複雑です。

最初の引数はprecisionであり、これは総桁数です。 2番目の引数はscaleで、小数点の右側の最大桁数です。

したがって、(4,2)には-99.99から99.99までの任意の値を指定できます。

目的の99.99ではなく3.80を取得する理由については、挿入する値は99.99よりも大きいと解釈される必要があるため、最大値が使用されます。テーブルの挿入または更新に使用しているコードを投稿できます。

編集

http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html に従って、スケールと精度の使用法の誤解を修正しました。

34
JYelton

はい、4,2は「合計4桁、うち2桁が小数点以下」を意味します。これは、00.00の形式の数値に変換されます。さらに、SQLクエリを表示する必要があります。 PHPは、正当な理由なしに3.80を99.99に変換しません。おそらく、クエリのフィールド/値の位置がずれていて、別のフィールドに属するより大きな数値を挿入しようとしています。

7
Marc B

あなたのコーディングについて何か他のものに気づきました。

INSERT INTO reports_services (id,title,description,cost) VALUES (0, 'test title', 'test decription ', '3.80')

「CREATE TABLE」コードでは、IDが「AUTO_INCREMENT」に設定されています。つまり、そのフィールドの結果が自動的に生成されます。ただし、上記のコードでは、挿入の1つとして、そこに0があります... AUTO_INCに設定されているため、空白のままにしたことを通知するのであれば、idkを使用します。またはそれがあなたが持っている実際のコードである場合...それがあなたが持っているコードである場合、あなたはそれを自動的に生成するためにフィールドセットにデータを送信しようとしてはならないだけでなく、それを行う正しい方法は間違っているでしょう

'0',

あなたが置く

0,

lol ....それが問題の一部を引き起こしているかもしれません...「テストの説明」の後のコードでも、「...」の前にスペースがあります。 。idk ..これが、あなたが今あなたの髪を引っ張っているかもしれないいくつかの他の問題を解決するのに役立つことを願っています。 ... がんばろう.. :)

更新.....

私はほとんど忘れていた...それが空であることを示すためにそこに0がある場合...あなたはタイトルとして「テストタイトル」を入力し、タイトルとして「3.whateverセント」を入力することができます「コスト」は空です......それが理由で最大になった可能性があります。間違えない場合は、NOT NULLに設定しているので、NULLのままにしておく必要があります。多分....笑

4
Optiq