なぜこのクエリは構文エラーではないのでしょうか?私は 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 ではありません。