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