我正在表中搜索
amount
列 DOUBLE(10,2)
上的完全匹配项。由于我使用的数据库驱动程序,我必须将我的金额绑定为字符串参数。一般来说,这很有效,但这会导致找不到某些值。
例如,比较
3.94
与 '3.94'
时:
SELECT CAST('3.94' AS DOUBLE(10,2)) = '3.94' `comp`, CAST('3.94' AS DOUBLE(10,2)) `cast`, '3.94' `string`;
数据库认为它们是相同的:
comp cast string
1 3.94 3.94
但是,当比较
7.94
与 '7.94'
时:
SELECT CAST('4.94' AS DOUBLE(10,2)) = '4.94' `comp`, CAST('4.94' AS DOUBLE(10,2)) `cast`, '4.94' `string`;
数据库认为它们是不同的:
comp cast string
0 4.94 4.94
在这两种情况下,我所显示的内容看起来相同的值,即使它们不匹配。我的假设是某处出现舍入错误,但我不完全理解失败的原因。
我还想知道是否有更好/替代的解决方案来解决这个问题,除了:
SELECT *
FROM `my_amounts_table`
WHERE
`amount` = CAST(:amount AS DECIMAL(10,2));
DOUBLE(和 FLOAT)无法准确表示大多数值。请改用 DECIMAL,它的设计初衷就是这样做:
SELECT
CAST('4.94' AS DECIMAL(10,2)) = '4.94' `comp`,
CAST('4.94' AS DECIMAL(10,2)) `cast`, '4.94' `string`;
您的列类型很可能首先应该是 DECIMAL。