Comportamento di Varchar con spazi alla fine


14

Quando uso un Varchar con spazi, alla fine ignora gli spazi.

ex:

declare @X varchar(50)

Questo...

set  @X= 'John'

...equivale a...

set @X= 'John           '

Li considera uguali. Come posso fare in modo che il sistema li riconosca come diversi?

Risposte:


23

Tutto è conforme allo standard ANSI:

Spazi vuoti finali spiegati :

SQL Server segue le specifiche ANSI / ISO SQL-92 (Sezione 8.2,, Regole generali n. 3) su come confrontare le stringhe con gli spazi. Lo standard ANSI richiede il riempimento per le stringhe di caratteri utilizzate nei confronti in modo che le loro lunghezze corrispondano prima di confrontarle. Il padding influenza direttamente la semantica dei predicati della clausola WHERE e HAVING e altri confronti di stringhe Transact-SQL. Ad esempio, Transact-SQL considera le stringhe 'abc' e 'abc' equivalenti per la maggior parte delle operazioni di confronto.

L'unica eccezione a questa regola è il predicato LIKE. Quando il lato destro di un'espressione di predicato LIKE presenta un valore con uno spazio finale, SQL Server non riempie i due valori della stessa lunghezza prima che si verifichi il confronto. Poiché lo scopo del predicato LIKE, per definizione, è facilitare le ricerche di schemi piuttosto che semplici test di uguaglianza di stringhe, ciò non viola la sezione della specifica ANSI SQL-92 menzionata in precedenza.

Ecco un esempio ben noto di tutti i casi sopra menzionati:

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

Ecco alcuni dettagli in più sul bianco finale e sulla LIKEclausola .

MA se si desidera differenziarli, è possibile decidere di utilizzare la DATALENGTHfunzione anziché LEN, perché

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

ti metterà 1 invece di

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

La soluzione è

  • utilizzare la funzione DATALENGTH per differenziare le stringhe
  • per eseguire il cast della stringa nel tipo NVARCHAR - potrebbe essere meglio dichiarare questo tipo al parametro di SP

Post spettacolare, finalmente trovato alcune buone informazioni
Gaspa79,

-2

Puoi semplicemente aggiungere uno spazio bianco alle tue condizioni.

set @X= 'John           \n'

Spazi di trascinamento nelle funzioni stringa


5
\nnon ha significato in SQL Server. Non viene interpretato come una nuova linea. Questa non è una risposta alla domanda posta comunque.
Martin Smith,

@MartinSmith ma è scritto in MSDN "Se devi avere spazi finali nella tua stringa, dovresti considerare di aggiungere uno spazio bianco alla fine, in modo che SQL Server non tagli la stringa."
Yiping
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.