为什么这样的查询不是语法错误?我有 SQL Server 背景,我真的很惊讶。
从 my_table WHERE id 中选择 *
我认为它会验证它是否具有值,但行为并不一致,使用 id 时它会返回具有 id 的位置,但使用 name 时它不会返回任何内容:
https://www.db-fiddle.com/f/enWGyAW4BtLC64PVzkbTVK/0
MySQL 有一些不符合标准 ANSI SQL 的行为。在这种情况下,MySQL 将整数零值视为 false,将任何整数非零值视为 true。在标准 SQL 中,整数与布尔值不同,但在 MySQL 中却是。
false
true
当您运行查询WHERE id时,它会返回id 0的行。
WHERE id
id 0
当您运行查询WHERE name时,它将字符串计算为整数,这意味着采用前导数字字符(如果有)的数值,并忽略任何后续的非数字字符。如果没有前导数字,则字符串的整数值为 0。
WHERE name
当您运行查询WHERE name时,仅当该列中存储的字符串具有非零前导数字时,它才会返回行。在您的示例 'outro' 中,它只有非数字,因此该值为零,并且无法满足条件。
'outro'
MySQL 的行为符合设计,但这不是标准 SQL。
MySQL 有一些不符合标准 ANSI SQL 的行为。在这种情况下,MySQL 将整数零值视为
false
,将任何整数非零值视为true
。在标准 SQL 中,整数与布尔值不同,但在 MySQL 中却是。当您运行查询
WHERE id
时,它会返回id 0
的行。当您运行查询
WHERE name
时,它将字符串计算为整数,这意味着采用前导数字字符(如果有)的数值,并忽略任何后续的非数字字符。如果没有前导数字,则字符串的整数值为 0。当您运行查询
WHERE name
时,仅当该列中存储的字符串具有非零前导数字时,它才会返回行。在您的示例'outro'
中,它只有非数字,因此该值为零,并且无法满足条件。MySQL 的行为符合设计,但这不是标准 SQL。