Chaînes vides: pourquoi ou quand est-il égal à?


17

Qui peut expliquer pourquoi

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

les rendements

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

La drôle de conséquence est que

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

la mise à jour remplacera en effet la chaîne vide par un blanc, mais la clause where reste vraie et les exécutions répétées de l'instruction update indiquent

(1 row(s) affected)

Réponses:


22

Explication des espaces vides :

SQL Server suit la spécification ANSI / ISO SQL-92 (Section 8.2,, Règles générales # 3) sur la façon de comparer des chaînes avec des espaces. La norme ANSI requiert un remplissage pour les chaînes de caractères utilisées dans les comparaisons afin que leurs longueurs correspondent avant de les comparer. Le remplissage affecte directement la sémantique des prédicats de clause WHERE et HAVING et d'autres comparaisons de chaînes Transact-SQL. Par exemple, Transact-SQL considère que les chaînes «abc» et «abc» sont équivalentes pour la plupart des opérations de comparaison.

La seule exception à cette règle est le prédicat LIKE. Lorsque le côté droit d'une expression de prédicat LIKE comporte une valeur avec un espace de fin, SQL Server ne remplit pas les deux valeurs à la même longueur avant la comparaison. Étant donné que le but du prédicat LIKE, par définition, est de faciliter les recherches de modèles plutôt que les simples tests d'égalité de chaîne, cela ne viole pas la section de la spécification ANSI SQL-92 mentionnée précédemment.

Voici un exemple bien connu de tous les cas mentionnés ci-dessus:

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

Voici quelques détails supplémentaires sur les espaces de fin et la LIKEclause .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.