Pourquoi une telle requête n’est-elle pas une erreur de syntaxe ? J'ai une expérience SQL Server et j'ai été vraiment surpris.
从 my_table WHERE id 中选择 *
Je pensais que cela validerait qu'il a une valeur, mais le comportement est incohérent, lors de l'utilisation de id, il renvoie l'emplacement avec id , mais lors de l'utilisation de name, il ne renvoie rien :
https://www.db-fiddle.com/f/enWGyAW4BtLC64PVzkbTVK/0
MySQL a certains comportements qui ne sont pas conformes à la norme ANSI SQL. Dans ce cas, MySQL traite la valeur entière zéro comme
false
,将任何整数非零值视为true
. En SQL standard, les entiers ne sont pas les mêmes que les booléens, mais dans MySQL, ils le sont.Lorsque vous exécutez la requête
WHERE id
时,它会返回id 0
la ligne.Lorsque vous exécutez une requête
WHERE name
, elle évalue la chaîne comme un entier, ce qui signifie prendre la valeur numérique du premier caractère numérique (le cas échéant) et ignorer les caractères non numériques suivants. S'il n'y a pas de chiffres en tête, la chaîne a une valeur entière de 0.Lorsque vous exécutez une requête
WHERE name
时,仅当该列中存储的字符串具有非零前导数字时,它才会返回行。在您的示例'outro'
, elle renverra des lignes uniquement si la chaîne stockée dans cette colonne a un nombre non nul. Dans votre exemple'outro'
il ne contient que des chiffres, donc la valeur est zéro et la condition ne peut pas être satisfaite.MySQL se comporte comme prévu, mais ce n'est pas du SQL standard.