mysql - 将逗号分隔的字符串与数字进行比较时,MySQL 的奇怪行为
问题描述
我在使用 MySQL 时遇到了一些奇怪的行为。基本上我有一个这样的表:
ID string
1 14
2 10,14,25
为什么这个查询会拉 id 2?
SELECT * FROM exampletable where string = 10
当然它应该寻找一个完全匹配,因为这只会拉 id 1:
SELECT * FROM exampletable where string = 14
我知道FIND_IN_SET
,我只是觉得奇怪的是第一个查询甚至可以提取任何东西。它的行为类似于以下查询:
SELECT * FROM exampletable where string LIKE '10%'
解决方案
当您比较数字和字符串值时,MySQL 将尝试将字符串转换为数字并匹配。类似数字的字符串也会被解析。我们有:
SELECT '10,14,25' = 1 -- 0
SELECT '10,14,25' = 10 -- 1
SELECT 'FOOBAR' = 1 -- 0
SELECT 'FOOBAR' = 0 -- 1
SELECT '123.456' = 123 -- 0
SELECT '123.456FOOBAR' = 123.456 -- 1
该行为记录在此处(在您的示例中,这是最后一条规则):
...
如果其中一个参数是十进制值,则比较取决于另一个参数。如果另一个参数是十进制或整数值,则将参数作为十进制值进行比较,如果另一个参数是浮点值,则将其作为浮点值进行比较。
在所有其他情况下,参数作为浮点(实)数进行比较。
推荐阅读
- javascript - 2D Javascript 数组未返回“第二维数组”的正确长度
- android - 如何使用本机应用程序在 PWA 中打开缓存文件?
- php - 无法在 shell_exec 中运行 sudo 命令
- python - 有什么方法可以使用 python 在 selenium 中单击 svg 元素?
- tensorflow - 使用带有 tf.image.adjust_jpeg_quality 的 tensorflow 时出错,输出形状未知?
- python - 获取可能的路径
- r - 如何在 R 数据框中使用两个不同的函数聚合两个不同的列
- gdb - VirtualBox GDB 存根
- java - 如何使用 g.drawArc() 逆时针制作弧线?
- python - 在 Django 中使用表单并检查是否输入了所有输入字段