Dalam MySQL, mengendalikan garis miring () dalam pertanyaan boleh mengelirukan. Pertimbangkan pertanyaan berikut:
<code class="sql">(SELECT * FROM `titles` where title = 'test\') UNION ALL (SELECT * FROM `titles` where title LIKE 'test\\')</code>
Anda mungkin menjangkakan bahawa pertanyaan kedua, menggunakan klausa LIKE, akan memerlukan garis miring ke belakang tambahan untuk melepaskan garis miring asal dalam "ujian". Walau bagaimanapun, keputusan menunjukkan bahawa kedua-dua pertanyaan berjaya mengembalikan baris yang sama, dengan "ujian" sebagai tajuk.
Percanggahan timbul kerana kelakuan MySQL dengan aksara melarikan diri dalam klausa WHERE dan LIKE. Dalam klausa WHERE, sengkang terbalik berfungsi sebagai watak melarikan diri, melindungi aksara khas daripada ditafsirkan secara literal. Sebaliknya, dalam klausa LIKE, garis miring ke belakang ialah aksara melarikan diri lalai, membolehkan anda melarikan diri daripada aksara lain dalam corak carian.
Seperti yang dinyatakan dalam manual MySQL untuk LIKE:
Oleh itu, manakala garis sengkang ke belakang dalam "ujian" dilepaskan secara automatik semasa menghuraikan klausa WHERE, ia mesti digandakan secara eksplisit (untuk "menguji\") untuk klausa LIKE agar sepadan dengan jujukan melarikan diri yang dimaksudkan.
Sebagai alternatif, anda boleh menentukan aksara melarikan diri yang berbeza untuk LIKE, seperti yang ditunjukkan dalam pertanyaan yang diubah suai berikut:
<code class="sql">SELECT * FROM `titles` WHERE title LIKE 'test\' ESCAPE '|'</code>Salin selepas log masukDengan menggantikan garis miring ke belakang dengan watak paip sebagai watak melarikan diri, anda boleh mencari "ujian" literal dengan tepat tanpa menggandakan garis miring ke belakang.
Atas ialah kandungan terperinci Mengapakah Saya Perlu Melarikan Diri secara Berbeza dalam Klausa WHERE dan LIKE MySQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!