it-swarm.asia

Perilaku Varchar dengan spasi di akhir

Ketika saya menggunakan Varchar dengan spasi, ia mengabaikan spasi di bagian akhir.

ex:

declare @X varchar(50)

Ini...

set  @X= 'John'

...sama dengan...

set @X= 'John           '

Ini menganggap ini sama. Bagaimana saya dapat menyebabkan sistem mengenali ini berbeda?

14
AMH

Semuanya sesuai dengan standar ANSI:

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 persamaan 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

Inilah beberapa detail lebih lanjut tentang mengeklik kosong dan klausa LIKE .

[~ # ~] tetapi [~ # ~] jika Anda ingin membuatnya berbeda - Anda dapat memutuskan untuk menggunakan fungsi DATALENGTH alih-alih LEN, karena

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

akan menempatkan Anda 1 sebagai gantinya

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

Solusinya adalah

  • untuk menggunakan fungsi DATALENGTH untuk membedakan antara string
  • untuk memasukkan string ke dalam tipe NVARCHAR - mungkin lebih baik menyatakan tipe ini ke parameter SP
23
Oleg Dok