Perilaku Varchar dengan spasi di akhir

14

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?

AMH
sumber

Jawaban:

23

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

Berikut ini beberapa detail tentang tertinggal kosong dan LIKEklausa .

TETAPI jika Anda ingin membuatnya berbeda - Anda dapat memutuskan untuk menggunakan DATALENGTHfungsi 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
Oleg Dok
sumber
Pos spektakuler, akhirnya menemukan beberapa info bagus
Gaspa79
-2

Anda bisa menambahkan ruang putih ke kondisi Anda.

set @X= 'John           \n'

Trailing Spaces dalam Fungsi String

Yiping
sumber
5
\ntidak memiliki arti dalam SQL Server. Itu tidak ditafsirkan sebagai baris baru. Lagi pula, ini bukan jawaban untuk pertanyaan yang diajukan.
Martin Smith
@ MartinSmith tetapi ditulis dalam MSDN "Jika Anda harus memiliki spasi tambahan di string Anda, Anda harus mempertimbangkan menambahkan karakter spasi putih di akhir, sehingga SQL Server tidak memangkas string."
Yiping