- 已关闭。**此问题为not reproducible or was caused by typos。当前不接受答案。
这个问题是由打字错误或无法再重现的问题引起的。虽然类似的问题在这里可能是on-topic,但这个问题的解决方式不太可能帮助未来的读者。
8小时前关门了。
Improve this question
我遇到了一个非常奇怪的问题。我正在开发一个自定义WordPress插件,我有一个数据库表,其中有一个名为pending_balance
的列,这是一个decimal(8,8)
数据类型。另一方面,我有这样的代码(这实际上是一个cron作业):
if ( ! empty( $subscriptions ) ) {
foreach ( $subscriptions as $subscription ) {
if($subscription->status != "inactive") {
// Calculating $new_pending_balance
error_log($algorithm . " - " . $new_pending_balance . PHP_EOL, 3, WCM_PLUGIN_DIR . 'error.log');
$wpdb->update(
$table_name,
array( 'pending_balance' => $new_pending_balance ),
array( 'id' => $subscription->id ),
array( '%f' ),
array( '%d' )
);
}
}
}
当cron作业运行时,我可以清楚地看到error.log
中的新日志。
bitcoin - 0.00038531
litecoin - 0.10420367
ethereumclassic - 1.27727247
当我打开数据库表以便查看ethereumclassic
的新待定余额时,显示为0.99999999
而不是1.27727247
。我尝试了许多方法,例如将$new_pending_balance
转换为100%完全相同的数据类型,我尝试过在$wpdb
上执行RAW查询,而不是使用->update()
方法。我还没有尝试过将列的数据类型改为string,这样就不会有问题了,但是我担心这样做是因为在插件内部的任何地方,计算都是从数据库中检索的纯值,而我现在实际上是从数据库中检索浮点数。如果我把它变成字符串可能会引起错误。我该怎么办,伙计们?
1条答案
按热度按时间efzxgjgh1#
DECIMAL(8,8)
意味着可以存储8位数字,其中8位是小数,这样1.27727247
中就没有你的1
了;列可以存储从-0.99999999
到0.99999999
的值。https://dev.mysql.com/doc/refman/8.0/en/fixed-point-types.html
标准SQL要求DECIMAL(5,2)能够存储任何五位数和两位小数的值,因此可以存储在salary列中的值的范围是-999.99到999.99。
您应该考虑打开MySQL的“严格模式”,这会给您一个“超出范围”的错误,而不是默默地转换值。