松散的WHERE语句

时间:2011-02-20 12:27:37

标签: sql mysql

以下3个查询将返回相同的记录:

SELECT * FROM items WHERE id = '1'
SELECT * FROM items WHERE id = '1 foo'
SELECT * FROM items WHERE id = '1 123'

似乎忽略了引号中空格后面的字符。

这是一个功能,它的目的是什么?

3 个答案:

答案 0 :(得分:6)

由于id是一个数字,当MySql将字符串转换为数字时,它们都会产生相同的结果:数字1

SELECT CAST('1' AS SIGNED) a,
  CAST('1 foo' AS SIGNED) b,
  CAST('1 123' AS SIGNED) c

结果:

a | b | c
1 | 1 | 1

答案 1 :(得分:1)

mysql引用的

This page表示mysql隐式地将字符串强制转换为数字,反之亦然。该页面示例说明了这一点:

mysql> SELECT 1 > '6x';
        -> 0
mysql> SELECT 7 > '6x';
        -> 1
mysql> SELECT 0 > 'x6';
        -> 0
mysql> SELECT 0 = 'x6';
        -> 1

在您的情况下,所有字符串都隐式地转换为数字1。

答案 2 :(得分:0)

我认为您提供的'字符串'正在转换为数字,因为id字段可能是一个整数。 如果是这种情况,那么转换将在到达非数字字符时停止,这就是空间。因此,所有字符串都转换为数字1并返回相同的行。