Empty Strings: Mengapa atau kapan '' sama dengan ''?

17

Siapa yang bisa menjelaskan mengapa

select case when '' = ' ' then 1 else 0 end, LEN(''), LEN(' '), DATALENGTH(''), DATALENGTH(' ');

hasil panen

----------- ----------- ----------- ----------- -----------
1           0           0           0           1

Konsekuensi lucu dari ini adalah bahwa di

create table test ( val varchar(10) );
insert into test values( '' );
update test set val = ' ' where val = '';

pembaruan memang akan mengganti string kosong dengan kosong, tetapi klausa di mana tetap benar dan eksekusi berulang dari pernyataan pembaruan memberitahu

(1 row(s) affected)
bernd_k
sumber

Jawaban:

22

Trailing blank menjelaskan :

SQL Server mengikuti spesifikasi ANSI / ISO SQL-92 (Bagian 8.2,, Aturan umum # 3) tentang cara membandingkan string dengan spasi. Standar ANSI membutuhkan padding untuk string karakter yang digunakan dalam perbandingan sehingga panjangnya cocok sebelum membandingkannya. Padding secara langsung mempengaruhi semantik predikat klausa WHERE dan HAVING dan perbandingan string Transact-SQL lainnya. Sebagai contoh, Transact-SQL menganggap string 'abc' dan 'abc' setara untuk sebagian besar operasi perbandingan.

Satu-satunya pengecualian untuk aturan ini adalah predikat LIKE. Ketika sisi kanan dari ekspresi predikat LIKE fitur nilai dengan spasi tambahan, SQL Server tidak memadatkan dua nilai dengan panjang yang sama sebelum perbandingan terjadi. Karena tujuan dari predikat LIKE, menurut definisi, adalah untuk memfasilitasi pencarian pola daripada tes kesetaraan string sederhana, ini tidak melanggar bagian dari spesifikasi ANSI SQL-92 yang disebutkan sebelumnya.

Berikut adalah contoh umum dari semua kasus yang disebutkan di atas:

DECLARE @a VARCHAR(10)
DECLARE @b varchar(10)

SET @a = '1'
SET @b = '1 ' --with trailing blank

SELECT 1
WHERE 
    @a = @b 
AND @a NOT LIKE @b
AND @b LIKE @a

Berikut ini beberapa detail tentang tertinggal kosong dan LIKEklausa .

Oleg Dok
sumber