Boş Dizeler: '' eşit '' neden veya ne zaman?


17

Kim neden açıklayabilir?

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

verim

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

Bunun komik sonucu şudur:

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

güncelleştirme gerçekten de boş dizeyi bir boşlukla değiştirir, ancak where cümlesi doğru olmaya devam eder ve update deyiminin tekrarlanan yürütmeleri

(1 row(s) affected)

Yanıtlar:


22

Sondaki boşluklar açıklandı :

SQL Server, dizelerin boşluklarla nasıl karşılaştırılacağı konusunda ANSI / ISO SQL-92 spesifikasyonunu (Bölüm 8.2, Genel kurallar # 3) takip eder. ANSI standardı, karşılaştırmalarda kullanılan karakter dizeleri için dolgulama gerektirir, böylece uzunlukları karşılaştırmadan önce eşleşir. Dolgu, WHERE ve HAVING yan tümcesinin tahminlerini ve diğer Transact-SQL dizesi karşılaştırmalarını doğrudan etkiler. Örneğin, Transact-SQL 'abc' ve 'abc' dizelerini çoğu karşılaştırma işlemi için eşdeğer kabul eder.

Bu kuralın tek istisnası GİBİ yüklemidir. LIKE yüklem ifadesinin sağ tarafında bir boşluk içeren bir değer olduğunda, SQL Server karşılaştırma yapılmadan önce iki değeri aynı uzunlukta doldurmaz. LIKE yükleminin amacı, tanım gereği, basit dize eşitliği testlerinden ziyade desen aramalarını kolaylaştırmak olduğundan, bu, daha önce bahsedilen ANSI SQL-92 spesifikasyonunun bölümünü ihlal etmez.

Yukarıda belirtilen tüm vakaların iyi bilinen bir örneği:

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

İşte sondaki boşluklar ve LIKEmadde hakkında daha fazla ayrıntı .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.