Sonunda boşluklarla Varchar'ın davranışı


14

Boşluklu bir Varchar kullandığım zaman sonunda boşlukları yok sayar.

örn:

declare @X varchar(50)

Bu...

set  @X= 'John'

...aynıdır...

set @X= 'John           '

Bunların eşit olduğunu düşünüyor. Sistemin bunları farklı olarak tanımasına nasıl neden olabilirim?

Yanıtlar:


23

Her şey sadece ANSI standardına göre:

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 dizileri 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 dize karşılaştırmalarının anlamı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ı LIKE yüklemidir. LIKE yüklem ifadesinin sağ tarafında bir boşluk bulunan 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 boşlukları ve LIKEfıkra hakkında biraz daha ayrıntı .

ANCAK onları farklılaştırmak istiyorsanız - DATALENGTHfonksiyon yerine kullanmaya karar verebilirsiniz LEN, çünkü

SELECT 1 WHERE LEN('John ') = LEN('John')

yerine 1 tane koyacağım

SELECT 1 WHERE DATALENGTH('John ') = DATALENGTH('John')

çözelti bir

  • arasında DATALENGTH işlevini kullanma
  • dizeyi NVARCHAR türüne dökmek için - bu türün SP parametresine bildirilmesi daha iyi olabilir

Muhteşem yazı, nihayet bazı iyi bilgiler bulundu
Gaspa79

-2

Durumunuza beyaz bir boşluk ekleyebilirsiniz.

set @X= 'John           \n'

Dize İşlevlerinde Sondaki Uzaylar


5
\nSQL Server'da bir önemi yoktur. Yeni bir satır olarak yorumlanmaz. Bu zaten sorulan sorunun cevabı değil.
Martin Smith

@MartinSmith ancak MSDN'de yazılmıştır "Dizenizde boşluk bırakmanız gerekiyorsa, sonuna beyaz boşluk karakteri eklemeyi düşünmelisiniz, böylece SQL Server dizeyi kırpmaz."
Yiping
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.