PHP中的浮点数/双精度数存储为MySQL DECIMAL

4
我是一个能够翻译文本的有用助手。

我在使用 MySQL 存储值时遇到了一个非常奇怪的问题。情况如下:

我有一张表,使用 DECIMAL(15,8) 来存储货币金额(例如订单总额),但是当我尝试插入例如:

2,45545345

这被存储为

2.00000000

我尝试了MySQL的FORMAT/CAST函数,但输出结果仍然相同。

查询语句是这样生成的:

$db->query("INSERT INTO `random_table_name` SET currency_value = '" . floatval($value) . "'");

我也尝试使用doubleval,但结果相同。有趣的是,这段代码几周前还能正常工作,我不记得数据库结构或数据库类发生任何改变会导致这种情况。


1
你的脚本使用了 setlocale 吗? - Salman A
可以,但我不能关闭或删除它。 - Anonymous
它是什么语言环境?floatval将根据语言环境将"2,45545345"转换为2.02.45545345 - Salman A
它应该在多语言环境下工作,这就是为什么我正在寻找更通用方法的原因。不过当前的问题出现在ro_RO。编辑: 将语言环境设置为en_US可以解决问题,但是否有另一种(更清洁)的方法? - Anonymous
2个回答

8
使用number_format替换掉,,改为.
像这样:
number_format($value, 8, '.') // 8 = number of decimals, . = decimal separator

然而,你的问题似乎与当前区域设置有关。你需要查看以下内容:setlocale()localeconv
setlocale(LC_ALL, 'en_US'); // NOT TESTED, read up on the appropriate syntax

这是做这件事的适当方式,另一种选择是(如下所述)进行str_replace(',','。'),但每次想要输出字符串时都必须反转。

还有另一种选择,您可以将MySQL语言环境设置为en_US


不是解决方案,因为它会产生相同的结果-2.0000000000。 - Anonymous
确实。您需要先设置适当的区域设置。美国区域设置应该可以解决问题,但不确定语法,因此我添加了链接,以便您可以查找。 - Vlad Preda
谢谢Vlad,正如Salman所建议的那样,setlocale在这里是罪魁祸首! - Anonymous

3

在插入到数据库之前,将,替换为.

$value = str_replace( ',', '.', $value);

这将创建一个有效的数字,可以安全地插入到数据库中。或者只需在查询语句中添加它:

INSERT INTO `random_table_name` SET currency_value = '" . str_replace( ',', '.', $value ) . "'

我尝试的第一件事情之一 - 不起作用,该值被数据库四舍五入为2。 - Anonymous
str_replace 无法将您的数字四舍五入到2。 - Peon
str_replace不起作用,但是使用MySQL的CAST/FORMAT函数时,数据库将该值存储为2.000000。 - Anonymous

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