2011-01-05 38 views
1

我最近刚修正了一些我的代码中的错误,希望有人能向我解释为什么发生错误。Mysql Like + Wild Card vs Equals Operator

我有这样的查询:

SELECT * FROM my_table WHERE my_field=13 

没想到,这回是行,其中my_field等于或者1313a。修复很简单,我改变了查询:

SELECT * FROM my_table WHERE my_field='13' 

我的问题是,这应该是这样吗?我一直认为,返回一个类似的领域,你会使用类似:

SELECT * FROM my_table WHERE my_field LIKE '13%' 

是什么样+外卡之间的区别VS等号操作员没有引号?

+0

我很想看看会是什么原因... – Chandu 2011-01-05 20:55:53

+0

谢谢大家。你们都似乎是对的,对不起,我不能选择你们全部:-) – 2011-01-05 21:51:17

回答

3

此语句为my_field = '13a'返回行:

SELECT * FROM my_table WHERE my_field=13 

由于MySQL执行类型从字符串转换在比较期间与数,转弯'13a'13。更多关于那。

添加引号会将整数转换为字符串,因此MySQL仅执行字符串比较。显然,'13'不能等于'13a'

LIKE子句总是执行字符串比较(除非其中一个操作数是NULL,在这种情况下结果是NULL)。

1

我的猜测是,因为你没有用引号把它括起来,而列是char/varchar列,MySQL试图将varchar列隐式转换为int。

如果该表中的某行包含无法转换为int的值,则可能会出现错误。此外,由于转换,您可能在该列上的任何索引都不会被使用。

1

这与类型和类型转换有关。使用my_field=13时,13是一个整数,而my_field在您的情况下可能是某种形式的文本/字符串。在这种情况下,mysql会尝试将两者都转换为浮点数并进行比较。

因此MySQL试图转换E,G,“13A”来浮子,这将其在13和13 = 13

my_field = '13',两个操作数是文本和将作为文本使用=

进行比较

my_field like '13%'这两个操作数都是文本,并将使用LIKE进行比较,其中特殊的%表示通配符。

你可以阅读关于类型转换mysql使用here

1

这是因为MySQL类型转换以这种方式工作。看到这里:http://dev.mysql.com/doc/refman/5.0/en/type-conversion.html

它也发布警告。看看下面的代码

mysql> select 12 = '12bibo'; 
    +---------------+ 
    | 12 = '12bibo' | 
    +---------------+ 
    |    1 | 
    +---------------+ 
    1 row in set, 1 warning (0.00 sec) 

    mysql> show warnings; 
    +---------+------+--------------------------------------------+ 
    | Level | Code | Message         | 
    +---------+------+--------------------------------------------+ 
    | Warning | 1292 | Truncated incorrect DOUBLE value: '12bibo' | 
    +---------+------+--------------------------------------------+ 
    1 row in set (0.00 sec) 

看起来像有人提出了一个错误,以及:http://bugs.mysql.com/bug.php?id=42241