我有一个包含某些字段的数据库表,其中一个字段cost
被设置为DECIMAL
数据类型。我将参数设置为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
后,它可以正常工作答案 0 :(得分:34)
MySql十进制类型比小数点左侧和右侧稍微复杂一点。
第一个参数是精度,即总位数。第二个参数是 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更正了对比例和精度使用的误解。
答案 1 :(得分:7)
是的,4,2表示“总共4位数,其中2位在小数位后”。这转换为00.00
格式的数字。除此之外,您还必须向我们展示您的SQL查询。没有充分理由,PHP不会将3.80翻译成99.99。也许您在查询中未对齐字段/值,并尝试插入属于另一个字段的较大数字。
答案 2 :(得分:3)
我注意到你的编码还有其他的东西......看看
INSERT INTO reports_services (id,title,description,cost) VALUES (0, 'test title', 'test decription ', '3.80')
在“CREATE TABLE”代码中,您将id设置为“AUTO_INCREMENT”,这意味着它会自动生成该字段的结果....但在上面的代码中,您将其作为插入之一包含在“ VALUES“你有一个0 ... idk如果这是你告诉我们你把它留空的方式,因为它被设置为AUTO_INC。或者如果这是你拥有的实际代码...如果它是代码,你不仅不应该尝试将数据发送到字段集以自动生成它,而且正确的做法是
'0',
你把
0,
大声笑....所以这可能会导致一些问题...我也只是在“测试描述”之后的代码中注意到你在'....之前有一个空间也可能会抛出一些东西.... idk ..我希望这有助于解决一些其他问题,你现在可能会把你的头发拉出来....说到哪......我需要弄清楚我的问题然后撕掉我的头发出.....祝你好运.. :)
UPDATE .....
我差点忘了......如果你有0那里显示它是空白的......你可以输入“测试标题”作为id和“测试描述”作为标题然后“3.whatever cents”for描述让“成本”空了......这可能就是为什么它最大化了,因为如果我没有误会你把它设置为NOT NULL ....你把它留空了...所以它强迫了一些东西......也许......大笑