如何将DECIMAL插入MySQL数据库

32

我有一个数据库表,其中一些字段之一 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后它可以工作


让我们来看一下创建表语句和插入值所使用的sql。 - mmmmmm
3个回答

39

MySql的小数类型比仅限于小数点左侧和右侧要复杂一些。

第一个参数是精度,即总位数。第二个参数是标度,即小数点右侧的最大数字位数。

因此,(4,2)可以是从-99.9999.99之间的任何数值。

至于为什么您得到的是99.99而不是期望的3.80,这是因为插入或更新表时插入的值被解释为大于99.99,因此使用了最大值。也许您可以发布一下您用于插入或更新表的代码。

编辑

根据http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html,对标度和精度的使用误解已经得到纠正。


8
是的,4,2表示“总共4位数字,其中2位在小数点后面”。这将转换为格式为00.00的数字。除此之外,您需要向我们展示SQL查询。如果没有充分的理由,PHP不会将3.80转换为99.99。也许您在查询中对齐了字段/值,并尝试插入属于另一个字段的更大数字。

6
我注意到你的代码还有另一个问题... 看看
INSERT INTO reports_services (id,title,description,cost) VALUES (0, 'test title', 'test decription ', '3.80')

在您的“CREATE TABLE”代码中,您将id设置为“AUTO_INCREMENT”,这意味着它会自动生成该字段的结果...但在您上面的代码中,您将其作为插入之一,并且在“VALUES”中有一个0...我不知道那是否是您告诉我们您将其留空,因为它被设置为AUTO_INC。还是说那是您实际拥有的代码...如果这是您的代码,不仅应该不尝试发送数据到设置为自动生成的字段,而且错误的方法是:
'0',

you put

0,

噢,可能这是问题的部分原因......我还注意到在“测试描述”之后的代码中,您在'....'之前有一个空格,这也可能导致了问题.......我不知道.....希望这能帮到你并解决你现在可能正在苦恼的其他问题......说到这个......在我把头发都拔光之前,我需要弄清楚我的问题.....祝好运.. :)

更新.....

我差点忘了......如果你把0放在那里表示为空......你可能会把“测试标题”作为id输入,“测试描述”作为标题,然后将“3.几分钱”作为描述留空“成本”......这可能是为什么它达到了最大值,因为如果我没有记错,您设置了NOT NULL ....而您又把它留空了......所以它强制执行了某些操作...或许....哈哈


2
感谢您的回答 - 不过在您添加答案之前我已经接受了正确的答案两个月了!将0传递给一个设置为auto_increment的字段与将其留空相同。 - Alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接