varchar
s et l'égalité sont épineux dans TSQL. Le LEN
la fonction dit :
Renvoie le nombre de caractères, plutôt que le nombre d'octets, de l'expression de chaîne donnée, à l'exclusion des blancs de fin .
Vous devez utiliser DATALENGTH
pour obtenir un vrai byte
décompte des données en question. Si vous avez des données Unicode, notez que la valeur que vous obtenez dans cette situation ne sera pas la même que la longueur du texte.
print(DATALENGTH(' ')) --1
print(LEN(' ')) --0
En ce qui concerne l'égalité des expressions, les deux chaînes sont comparées pour l'égalité comme ceci :
- Obtenir une chaîne plus courte
- Bloc avec des blancs jusqu'à ce que la longueur soit égale à celle de la chaîne la plus longue
- Comparez les deux
C'est l'étape intermédiaire qui provoque des résultats inattendus - après cette étape, vous comparez effectivement les espaces blancs aux espaces blancs - ils sont donc considérés comme égaux.
LIKE
se comporte mieux que =
dans la situation "vides" car il n'effectue pas de remplissage de blancs sur le modèle que vous essayez de faire correspondre :
if '' = ' '
print 'eq'
else
print 'ne'
Donnera eq
tandis que :
if '' LIKE ' '
print 'eq'
else
print 'ne'
Donnera ne
Attention avec LIKE
cependant :il n'est pas symétrique :il traite les espaces de fin comme significatifs dans le modèle (RHS) mais pas l'expression de correspondance (LHS). Ce qui suit est tiré d'ici :
declare @Space nvarchar(10)
declare @Space2 nvarchar(10)
set @Space = ''
set @Space2 = ' '
if @Space like @Space2
print '@Space Like @Space2'
else
print '@Space Not Like @Space2'
if @Space2 like @Space
print '@Space2 Like @Space'
else
print '@Space2 Not Like @Space'
@Space Not Like @Space2
@Space2 Like @Space