首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SELECT * FROM tableName WHERE 'num+sometext‘

问SELECT * FROM tableName WHERE 'num+sometext‘
EN

Stack Overflow用户
提问于 2018-02-23 14:20:59
回答 4查看 153关注 0票数 0

我很好奇,这些查询是如何在数据库引擎中工作的。我特别关注的是4号和6号线。

代码语言:javascript
复制
1.SELECT * FROM tableName
2.SELECT * FROM tableName WHERE 1
3.SELECT * FROM tableName WHERE 123
4.SELECT * FROM tableName WHERE '2xyz'

5.SELECT * FROM tableName WHERE ''
6.SELECT * FROM tableName WHERE 'xyz'

在上面的查询中,1、2、3、4产生相同的结果,但5和6没有产生任何结果。为什么?'2xyx‘和'xyz’的不同b/w是什么?“2xyz”如何隐式转换为2?

EN

回答 4

Stack Overflow用户

发布于 2018-02-23 14:47:46

where子句的计算结果为布尔值true (非0)或false (0),以确定记录是在结果集中还是在结果集中。

  • 案例2和3检索所有记录,因为非零数字的计算结果为true。
  • 案例3检索所有记录,因为在隐式字符串到数字的转换期间,mysql逐个字符从左到右计算字符串。只要字符可以被计算为数字,mysql就会采用它们的值。这包括删除前导空格、解释加号或减号、小数点等。因此,字符串'2xyx'被解释为2,因此布尔值为true。
  • Case 4和5不检索任何记录,因为字符串最左边的字符不能被计算为数字,因此转换返回0,因此布尔值为false。

不幸的是,隐式字符串到数字的转换并没有记录在MySQL手册中。但是,大多数规则可以从手册的Type Conversion in Expression Evaluation部分的以下部分中推导出来:

对于字符串列与数字的比较,MySQL不能使用列上的索引来快速查找该值。如果str_col是索引字符串列,则在以下语句中执行查找时不能使用该索引:

SELECT * FROM tbl_name WHERE str_col=1;1

这是因为有许多不同的字符串可以转换为值1,如“1”、“1”或“1a”。

票数 2
EN

Stack Overflow用户

发布于 2018-02-23 14:30:58

它是WHERE <condition>,例如WHERE col1 = 123。取而代之的是WHERE <number>或WHERE <string>,因此缺少一个表达式。

然而,WHERE <boolean>是可能的,这也是MySQL所期望的。由于MySQL像对待数字一样对待布尔值(0 =假,其他数=真),所以它查找一个数字。

  • 1和123是导致true的数字。
  • ‘2xyz’被转换为2,即true。
  • ‘’和'xyz‘被转换为0,即false。

因此,当where条件呈现为false时,后者会给出一个空的结果集。

票数 0
EN

Stack Overflow用户

发布于 2018-02-23 14:51:43

在语句SELECT ... WHERE [where_condition]中,在where_condition expression中,您可以使用MySQL支持的任何函数和运算符,在这些函数和运算符中也支持string literal。对于字符串,比较基于字符串单元的数值。在计算表达式时,也会执行type conversion。

因此,在上面的例子中,2xyz被转换为2,即true,因此您将获得所有记录。它就像

代码语言:javascript
复制
SELECT * FROM tableName WHERE 2

字符串xyz被转换为,该字符串为false,因此得到的结果集为空。它与以下内容相同:

代码语言:javascript
复制
SELECT * FROM tableName WHERE 0
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48942263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档