Mengapa pertanyaan sedemikian bukan ralat sintaks? Saya mempunyai latar belakang SQL Server dan saya sangat terkejut.
从 my_table WHERE id 中选择 *
Saya fikir ia akan mengesahkan bahawa ia mempunyai nilai, tetapi tingkah lakunya tidak konsisten, apabila menggunakan id ia mengembalikan lokasi dengan id , tetapi apabila menggunakan nama ia tidak mengembalikan apa-apa:
https://www.db-fiddle.com/f/enWGyAW4BtLC64PVzkbTVK/0
MySQL mempunyai beberapa tingkah laku yang tidak mematuhi standard ANSI SQL. Dalam kes ini, MySQL menganggap nilai sifar integer sebagai
false
,将任何整数非零值视为true
. Dalam SQL standard, integer tidak sama dengan boolean, tetapi dalam MySQL ia adalah.Apabila anda menjalankan pertanyaan
WHERE id
时,它会返回id 0
baris.Apabila anda menjalankan pertanyaan
WHERE name
, ia menilai rentetan sebagai integer, yang bermaksud mengambil nilai berangka aksara angka terkemuka (jika ada) dan mengabaikan sebarang aksara bukan angka berikutnya. Jika tiada digit pendahuluan, rentetan mempunyai nilai integer 0.Apabila anda menjalankan pertanyaan
WHERE name
时,仅当该列中存储的字符串具有非零前导数字时,它才会返回行。在您的示例'outro'
, ia akan mengembalikan baris hanya jika rentetan yang disimpan dalam lajur itu mempunyai nombor pendahuluan bukan sifar. Dalam contoh anda'outro'
ia hanya mempunyai bukan digit, jadi nilainya adalah sifar dan syaratnya tidak boleh dipenuhi.MySQL berkelakuan seperti yang direka, tetapi ia bukan SQL standard.