首先,列创建如下:
`avg_price` float NOT NULL default 0,
`total_price` float NOT NULL default 0,
`count` int(11) NOT NULL default 0,
当我执行这样的动作时:
update `member` set avg_price = format(`total_price`/`count`,2) where id = 971473
结果不符合我的期望。当total_price
为9003且计数为4时,avg_price预计会更新为2250.75,但它只会更新为2。
答案 0 :(得分:2)
format()
生成一个字符串,其中可能包含逗号。没有什么可以保证format()
结果可以存储到FLOAT中。avg_price
可以从total_price
和count
计算得出,因此有一个强有力的理由说它根本不应该是一个列,并且这是一个违规行为3NF您可以通过select total_price/count as avg_price
随时获取。您可能希望在该阶段对其进行格式化。不在数据库中。答案 1 :(得分:1)
你能解释一下这个问题是什么吗?
update `member`
set avg_price = 8765.33
where id = 971473;
format()
应该做什么?您已将avg_price
声明为float
,因此无需使用返回字符串的函数。
答案 2 :(得分:0)
戈登解释了你应该做什么,但未能解释为什么你只得到8的价值。
format(8765.33,2)
以字符串形式返回'8,765.33'
。然后Mysql尝试将此字符串转换为数字。在转换过程中,只要该值可以解释为数字,mysql就会逐个字符地处理字符串。逗号在数字中没有位置,因此mysql在那里停止处理字符串并返回它可以解释为数字的值 - 这是8。
如果要格式化的数字小于1000,则format()
不会在字符串中放置逗号,因此mysql可以将字符串转换为数字。我想您只想对数字进行舍入,因此请改用round()函数:
round(`total_price`/`count`,2)
还考虑使用decimal data type来存储任何价格,因为它存储的是精确值而不是浮点数。
其余的由戈登解释。