MySQL中,select <字段> from <表名> where <字段>的疑惑?

在网友发的一段SQL中,因为在where后边跟条件时少了具体的条件,只剩下一个字段作为条件,而还是能查询出来数据,不过数据只能是数字开头的,而字母和0开头的会被过滤掉,具体情况如下图:

image.png

所以来问问大佬们,MySQL中的 select <字段> from <表名> where <字段> 这种情况,是具体以什么作为条件。

Oracle中会自动报错:
image.png

阅读 2.2k
2 个回答

打开 MySQL 文档,找到有关 where 的介绍

image.png

译:如果给定了WHERE子句,则表明必须满足哪些条件才能选择行。where_condition是一个表达式,对于每条要选择的行来说,其值为真。如果没有WHERE子句,该语句会选择所有的记录。

在WHERE表达式中,你可以使用MySQL支持的任何函数和操作符,但聚合(组)函数除外。见第9.5节 "表达式 "和第12章 "函数和运算符"。

简单的说,就是 where 后面是一个表达式,你可以把这里的 uuid 当成是这样就当成是一个值,where 的条件就是值能转为 true 的时候成立。

见表达式章节:

image.png

实际相当于隐式转换成数值、然后当布尔值判断的。

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. 实际项目中千万不要依赖这种特性,会被人打的

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题