為什麼這樣的查詢不是語(yǔ)法錯(cuò)誤?我有 SQL Server 背景,我真的很驚訝。
從 my_table WHERE id 中選擇 *
我認(rèn)為它會(huì)驗(yàn)證它是否具有值,但行為並不一致,使用 id 時(shí)它會(huì)返回具有 id 的位置,但使用 name 時(shí)它不會(huì)返回任何內(nèi)容:
https://www.db-fiddle.com/f/enWGyAW4BtLC64PVzkbTVK/0
MySQL 有一些不符合標(biāo)準(zhǔn) ANSI SQL 的行為。在這種情況下,MySQL 將整數(shù)零值視為 false
,將任何整數(shù)非零值視為 true
。在標(biāo)準(zhǔn) SQL 中,整數(shù)與布林值不同,但在 MySQL 中卻是。
當(dāng)您執(zhí)行查詢WHERE id
時(shí),它會(huì)傳回id ?? 0
的行。
當(dāng)您執(zhí)行查詢WHERE name
時(shí),它將字串計(jì)算為整數(shù),這表示採(cǎi)用前導(dǎo)數(shù)字字元(如果有)的數(shù)值,並忽略任何後續(xù)的非數(shù)字字元。如果沒有前導(dǎo)數(shù)字,則字串的整數(shù)值為 0。
當(dāng)您執(zhí)行查詢WHERE name
時(shí),只有當(dāng)該列中儲(chǔ)存的字串具有非零前導(dǎo)數(shù)字時(shí),它才會(huì)傳回行。在您的範(fàn)例 'outro'
中,它只有非數(shù)字,因此該值為零,無(wú)法滿足條件。
MySQL 的行為符合設(shè)計(jì),但這不是標(biāo)準(zhǔn) SQL。