Saya menemukan beberapa perilaku yang menarik pada SQL Server (diamati pada 2005 dan 2012) hari ini bahwa saya berharap seseorang dapat menjelaskan.
Kueri yang melakukan perbandingan menggunakan =
pada bidang NVARCHAR mengabaikan ruang tambahan dalam string (atau otomatis memotong nilai sebelum perbandingan) tetapi kueri yang sama menggunakan like
operator tidak mengabaikan ruang. Kolasi yang digunakan adalah Latin1_General_CI_AS pada 2012.
Pertimbangkan SQL Fiddle ini: http://sqlfiddle.com/#!6/72262/4
Perhatikan bahwa like
operator tidak mengembalikan hasil untuk string spasi tambahan, tetapi =
operator melakukannya. Kenapa ini?
Poin bonus: Saya tidak dapat meniru ini pada bidang VARCHAR, saya akan berpikir bahwa ruang akan ditangani dengan cara yang sama di kedua tipe data - apakah ini benar?
MyString+'x' = ltrim(rtrim(MyString))+'x'
seperti yang disarankan di blog iniJawaban:
Jawaban awal saya menyarankan bahwa bendera ANSI_PADDING yang disetel ke MATI mungkin merupakan penyebab perbedaan perilaku. Namun, ini tidak benar; bendera ini hanya memiliki efek pada penyimpanan, tetapi bukan perbandingan kesetaraan.
Perbedaannya berasal dari penerapan standar SQL oleh Microsoft . Standar menyatakan bahwa ketika memeriksa kesetaraan, kedua string kiri dan kanan operator kesetaraan harus diisi agar memiliki panjang yang sama . Ini menjelaskan hasil-hasil berikut:
Operator LIKE tidak memasang operan. Itu juga berperilaku berbeda untuk
VARCHAR
danNVARCHAR
jenis kolom :Perilaku operator LIKE untuk tipe ASCII adalah khusus SQL Server; untuk jenis Unicode itu adalah ANSI-compliant.
sumber
SQL lahir di era ketika sebagian besar bahasa pemrosesan data menggunakan panjang tetap untuk setiap bidang / variabel. Padding otomatis bidang teks dengan spasi tambahan juga merupakan bagian dari gambar itu. Untuk sejajar dengan perilaku itu, tipe SQL CHAR asli secara eksplisit didefinisikan untuk operator '=' untuk mengabaikan spasi tambahan. (Jika Anda merasa aneh, tunjukkan pada saya kasus yang menarik di mana spasi tambahan yang ditambahkan ke teks memiliki arti bisnis nyata yang sebenarnya .)
SQL CHAR tipe telah berevolusi dalam segala macam arah sejak itu, tetapi tidak terbayangkan bahwa tipe data yang lebih modern tertentu masih mewarisi beberapa karakteristik dari pendahulunya.
sumber
Dalam dokumentasi untuk LIKE (Transact-SQL) , Microsoft menulis (penekanan saya):
sumber