为什么像这样的查询不是语法错误?我有SQL Server背景,我真的很惊讶。SELECT * FROM my_table WHERE id
我以为它会验证它是否有值,但行为并不一致,对于id,它会返回它有id的地方,但对于name,它不会返回任何东西:
https://www.db-fiddle.com/f/enWGyAW4BtLC64PVzkbTVK/0
为什么像这样的查询不是语法错误?我有SQL Server背景,我真的很惊讶。SELECT * FROM my_table WHERE id
我以为它会验证它是否有值,但行为并不一致,对于id,它会返回它有id的地方,但对于name,它不会返回任何东西:
https://www.db-fiddle.com/f/enWGyAW4BtLC64PVzkbTVK/0
1条答案
按热度按时间8fq7wneg1#
MySQL有一些行为与标准ANSI SQL不兼容。在这种情况下,MySQL将整数零值视为
false
,将任何整数非零值视为true
。在标准SQL中,整数与布尔值不同,但在MySQL中它们是。当您运行查询
WHERE id
时,它将返回id <> 0
所在的行。当你运行一个查询
WHERE name
时,它将字符串作为一个整数来计算,这意味着如果有前导数字字符,则取其数值,忽略后面的任何非数字字符。如果没有前导数字,则字符串的整数值为0。当你运行一个查询
WHERE name
时,只有当存储在该列中的字符串有非零的前导数字时,它才会返回行。在你的例子'outro'
中,它只有非数字,所以值为零,它不满足条件。MySQL按设计运行,但这不是标准SQL。