MariaDB查询无法匹配带逗号的浮点数,POS系统即时取消功能异常排查求助
MariaDB查询无法匹配带逗号的浮点数,POS系统即时取消功能异常排查求助
哈,碰到过类似的坑!先给你列几个最可能的排查方向,亲测有用:
1. 揪出浮点数精度的“隐形差异”
你用floatval转成float类型后,看起来和数据库里的数值一样,但float是单精度浮点数,本身就有精度丢失的问题——比如数据库里存的123.45可能在内存里是123.44999999999999,肉眼看不出,但对比的时候就是不相等。
解决办法:
- 紧急测试:把代码里的
floatval换成strval,直接用字符串去匹配(前提是数据库里的amount_total是字符串类型,或者你把$total转成和数据库存储格式完全一致的字符串) - 长远方案:金额字段绝对不要用float/double存!立刻改成
DECIMAL(10,2)这种定点数类型,从根源上避免精度问题,这是金融类系统的常识
2. 检查小数点/千分位的符号问题
很多地区的POS系统会用逗号(,)当小数点,而PHP的floatval只认点(.)当小数点。比如如果你的$AmountArray[2]是123,45,floatval转出来会是123,自然匹配不到数据库里的123.45。
排查方法:
- 在代码里加个
var_dump($total);,看看转出来的数值是不是你预期的 - 直接去数据库里看
amount_total的实际存储格式:是123.45还是123,45?字段类型是数值还是字符串?
3. 换用Joomla的参数绑定,别直接拼字符串
你原代码里应该是直接把$total拼进查询了吧?别这么干,用Joomla的参数绑定更安全,还能自动处理类型匹配问题:
// 把原来的where条件改成这样 $query->where($db->quoteName('amount_total') . ' = :total'); // 绑定参数并指定类型 $query->bind(':total', $total, \Joomla\Database\ParameterType::DECIMAL);
4. 检查数据库字段的“隐藏细节”
- 是不是
amount_total字段前后有空格或者不可见字符?比如数据库里存的是123.45(前面有空格),你用123.45当然匹配不到 - 字段类型如果是varchar,有没有可能存储时用了不同的小数位数?比如数据库里是
123.450,你用123.45去匹配字符串的话就会失败
先按这几个方向查,大概率能找到问题!
备注:内容来源于stack exchange,提问作者Gratia-Mira
相关产品推荐
相关产品推荐

