在网友发的一段SQL中,因为在where后边跟条件时少了具体的条件,只剩下一个字段作为条件,而还是能查询出来数据,不过数据只能是数字开头的,而字母和0开头的会被过滤掉
,具体情况如下图:
所以来问问大佬们,MySQL中的 select <字段> from <表名> where <字段> 这种情况,是具体以什么作为条件。
Oracle中会自动报错:
字母和0开头的会被过滤掉
,具体情况如下图:所以来问问大佬们,MySQL中的 select <字段> from <表名> where <字段> 这种情况,是具体以什么作为条件。
Oracle中会自动报错:
实际相当于隐式转换成数值、然后当布尔值判断的。
SELECT
`uuid`,
CAST(`uuid` AS DECIMAL(10, 2)),
IF(CAST(`uuid` AS DECIMAL(10, 2)) != 0, TRUE, FALSE)
FROM `test0512`;
你这么看下结果就该明白了。
这种隐式转换有点儿类似于 JS 里的 parseFloat()
方法,就是从左往右挨个儿字符判断,直到出现一个非数字或者多个小数点为止。
P.S.1. 0 开头那条被过滤了是另一个巧合,因为你第二位是 B,所以按这种规则转换完就剩个 0 了。第二位要是个 1 或者别的什么数字也会保留的。
P.S.2. 实际项目中千万不要依赖这种特性,会被人打的。
5 回答3.3k 阅读✓ 已解决
3 回答3.6k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
5 回答1.4k 阅读
3 回答1.3k 阅读✓ 已解决
2 回答1.8k 阅读
3 回答2k 阅读
打开 MySQL 文档,找到有关 where 的介绍
简单的说,就是 where 后面是一个表达式,你可以把这里的 uuid 当成是这样就当成是一个值,where 的条件就是值能转为 true 的时候成立。
见表达式章节: