我很好奇,这些查询如何在数据库引擎中工作。我特别关注的是4号和6号线。
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'是什么?
如何将'2xyz'隐式转换为2?
最佳答案
where
子句的计算结果为布尔值true(非0)或false(0),以确定记录是否在结果集中。
情况2和3检索所有记录,因为非零数字计算为true。
情况3检索所有记录,因为在隐式字符串到数字的转换过程中,mysql从左到右逐个字符地评估字符串。只要字符可以被评估为数字,mysql就会取其值。这包括切掉前导空格,解释加号或减号,小数点等等。因此,字符串'2xyx'
被解释为2,因此为布尔值true。
情况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”。
关于mysql - SELECT * FROM tableName WHERE'num + sometext',我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48942263/