如果我运行查询,请在MySQL上
SELECT * FROM table WHERE id = '1blah'
并且存在ID为1的记录,查询将实际返回该记录。我正在通过Workbench和PHP / Doctrine执行查询,并得到相同的结果。
为什么MySQL会这样做?这里涉及的是更一般的数据库概念吗?语言/客户端是否在此处发挥作用?
最后,PostgreSQL和Oracle将如何表现?
答案 0 :(得分:5)
Postgres和Oracle会(正确地)返回语法错误:
# select 1 = '1abc';
ERROR: invalid input syntax for integer: "1abc"
LINE 1: select 1 = '1abc';
MySQL允许这样做,因为它进行了隐式转换。可以把它想象成技术债务,一直追溯到它的第一个版本。它允许(例如)PHP应用程序执行select * from foo where id = '1'
之类的查询。无论好坏。
如果您不喜欢这种行为,您可以通过使MySQL从MySQL 5开始以严格模式运行来禁用它。但这会破坏大多数PHP应用程序。
答案 1 :(得分:3)
默认情况下,MySQL以非严格模式运行,这就是您看到此行为的原因。基本上,默认模式将进行转换,以使用户的生活更轻松。不幸的是,我发现它在尝试调试时会让你的生活变得更加困难。
通过执行TRADITIONAL
SET sql_mode=TRADITIONAL;
模式
这将启用数据检查,空检查,除零检查等。
有关详细信息,请参阅here和MySQL manual。
正如Denis所说,如果你的ID是一个整数列,或者如果ID是文本(或文本变体),任何符合该条件的行,PostgreSQL和Oracle都会返回错误,这就像你期望的那样和IMO默认情况下会发生什么。