Php 如何在MySQL中将两个数字作为字符串进行比较?

Php 如何在MySQL中将两个数字作为字符串进行比较?,php,mysql,compare,Php,Mysql,Compare,我想比较两个字符串作为MySQL中的数字。我的表格中有以下数据: 0.15公斤 0.52公斤 0.68公斤 1.24公斤 现在,我想将一个字符串与该数据进行比较。我尝试的是: SELECT * FROM `foobar` WHERE weight+0.0 <= '0,7 kg' 由于MySQL似乎不理解逗号作为十进制分隔符,我尝试用点替换它: SELECT * FROM `foobar` WHERE REPLACE(weight+0.0,',','.') <= REPLACE('0

我想比较两个字符串作为MySQL中的数字。我的表格中有以下数据:

0.15公斤 0.52公斤 0.68公斤 1.24公斤

现在,我想将一个字符串与该数据进行比较。我尝试的是:

SELECT * FROM `foobar` WHERE weight+0.0 <= '0,7 kg'
由于MySQL似乎不理解逗号作为十进制分隔符,我尝试用点替换它:

SELECT * FROM `foobar` WHERE REPLACE(weight+0.0,',','.') <= REPLACE('0,7 kg',',','.')

然而,我总是得到奇怪的结果,包括大于0.7的数字。奇怪的是,当我尝试排序权重列时,排序是正确的

使用construct CASTval作为小数10,2

SELECT * FROM `foobar `
WHERE CAST(REPLACE(weight,',','.') AS DECIMAL(10,2)) <= CAST(REPLACE('0,7 kg',',','.') AS DECIMAL(10,2));
对查询进行了测试,并给出了正确的结果


此解决方案无法使用索引。更好的方法是查询填充有计算数据的临时表。或者,您可以将索引的十进制列weight_dec添加到此表中,并使用触发器根据权重填充数据。然后使用weight_dec进行查询。

只需正确存储数据。当然,您应该将其分开,如草莓所述。但mysql能够对此进行排序。例如,当foo>'0,52'工作时。是的,我知道它应该以不同的方式存储。如果数字后面有“kg”,排序就不能正常工作。@phpheini也这么认为。但它实际上是有效的:使用无符号十进制5,2列类型来存储数据,您可以根据需要在Display上轻松地将kg追加到数据中。谢谢!你知道这两个操作是否会花费大量的性能,或者在生产中使用它可以吗?我认为它会花费一些,但是你说你坚持使用这种db设计。不要忘记将@phpheini标记为答案:@phpheini任何查询,其中列值用作函数的参数或与运算符结合使用,例如where子句中的weight+0会在scale上导致严重的性能损失,因为它强制表扫描对每一行计算函数,防止在任何RDBMS(不仅仅是MySQL)中对相关列使用任何索引。您不应该编写这样的查询。然而,如果您正在做类似的事情,那么这个查询的性能不会比其他任何查询都差。你需要修正你的设计。在那之前,这是正确的解决方案。阅读关于sargability的文章,了解更多关于这个主题的信息。。。明确地说,铸造和更换本身的影响可以忽略不计。问题是,在谓词中使用任何函数都会破坏可用性。如果您的表不经常更改,您可以创建其他表,并使用其他表中的计算数据填充它。这是生成报告和统计数据的常见做法。它使您能够在WHERE子句中使用计算列。所以您可以填充十进制列并对其执行快速查询。