PostgreSQL和Oracle如何处理SELECT * WHERE id ='1blah'之类的查询?

时间:2013-06-26 13:35:55

标签: mysql sql database oracle postgresql

如果我运行查询,请在MySQL上

SELECT * FROM table WHERE id = '1blah'

并且存在ID为1的记录,查询将实际返回该记录。我正在通过Workbench和PHP / Doctrine执行查询,并得到相同的结果。

为什么MySQL会这样做?这里涉及的是更一般的数据库概念吗?语言/客户端是否在此处发挥作用?

最后,PostgreSQL和Oracle将如何表现?

2 个答案:

答案 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

使MySQL的行为像传统数据库服务器一样启用SET sql_mode=TRADITIONAL;模式

这将启用数据检查,空检查,除零检查等。

有关详细信息,请参阅hereMySQL manual

正如Denis所说,如果你的ID是一个整数列,或者如果ID是文本(或文本变体),任何符合该条件的行,PostgreSQL和Oracle都会返回错误,这就像你期望的那样和IMO默认情况下会发生什么。