L'opérateur = en T-SQL n'est pas tant "égal" que "sont le même mot/phrase, selon la collation du contexte de l'expression", et LEN est "le nombre de caractères dans le mot/phrase". Aucune collation ne traite les blancs de fin de chaîne comme faisant partie du mot/de la phrase qui les précède (bien qu'elles traitent les blancs de début de chaîne comme faisant partie de la chaîne qu'ils précèdent).
Si vous devez distinguer 'ceci' de 'ceci', vous ne devez pas utiliser l'opérateur "sont le même mot ou la même phrase" car 'ceci' et 'ceci' sont le même mot.
L'idée selon laquelle l'opérateur d'égalité des chaînes de caractères devrait dépendre du contenu de ses arguments et du contexte de collation de l'expression, mais ne devrait pas dépendre des types des arguments, s'ils sont tous deux des chaînes de caractères, contribue au fonctionnement de =.
Le concept en langage naturel de "ces mots sont les mêmes" n'est généralement pas assez précis pour pouvoir être capturé par un opérateur mathématique comme =, et il n'y a pas de concept de type de chaîne dans le langage naturel. Le contexte (c'est-à-dire la collation) est important (et existe dans le langage naturel) et fait partie de l'histoire, et des propriétés supplémentaires (certaines qui semblent bizarres) font partie de la définition de = afin de le rendre bien défini dans le monde non naturel des données.
En ce qui concerne la question du type, vous ne voudriez pas que les mots changent lorsqu'ils sont stockés dans des types de chaînes différents. Par exemple, les types VARCHAR(10), CHAR(10) et CHAR(3) peuvent tous contenir des représentations du mot 'cat', et ? = 'cat' devrait nous permettre de décider si une valeur de l'un de ces types contient le mot 'cat' (les questions de casse et d'accent étant déterminées par la collation).
Réponse au commentaire de JohnFx :
Ver Utilisation des données char et varchar dans Livres en ligne. Citation de cette page, c'est moi qui souligne :
Chaque valeur de données char et varchar possède une collation. Les collations définissent des attributs tels que les modèles binaires utilisés pour représenter chaque caractère, règles de comparaison et la sensibilité à la casse ou à l'accentuation.
Je reconnais qu'il pourrait être plus facile à trouver, mais il est documenté.
Il convient également de noter que la sémantique de SQL, où = est lié aux données du monde réel et au contexte de la comparaison (par opposition à quelque chose concernant les bits stockés sur l'ordinateur), fait partie de SQL depuis longtemps. Le principe des SGBDR et de SQL est la représentation fidèle des données du monde réel, d'où la prise en charge des collations bien des années avant que des idées similaires (comme CultureInfo) n'entrent dans le domaine des langages de type Algol. Le principe de ces langages (du moins jusqu'à très récemment) était la résolution de problèmes d'ingénierie, et non la gestion de données commerciales. (Récemment, l'utilisation de langages similaires dans des applications qui ne relèvent pas de l'ingénierie, comme la recherche, fait quelques percées, mais Java, C#, etc. se débattent toujours avec leurs racines non commerciales).
À mon avis, il n'est pas juste de reprocher à SQL d'être différent de "la plupart des langages de programmation". SQL a été conçu pour prendre en charge un cadre de modélisation des données d'entreprise qui est très différent de l'ingénierie, le langage est donc différent (et meilleur pour son objectif).
Lorsque SQL a été spécifié pour la première fois, certains langages n'avaient pas de type de chaîne intégré. Et dans certains langages encore, l'opérateur égal entre chaînes de caractères ne compare pas du tout des données de caractères, mais des références ! Je ne serais pas surpris si, dans une ou deux décennies, l'idée que == dépend de la culture devenait la norme.
2 votes
SQL 2005 : select len(' ') renvoie 0
1 votes
Il fait la même chose sur Sql Server 2000.
1 votes
C'est une question fascinante. Il semble que le résultat soit égal, quel que soit le nombre d'espaces que vous mettez dans l'une ou l'autre des chaînes, qu'elles correspondent ou non. Après plus d'expérimentation, j'ai remarqué qu'il effectue effectivement un RTRIM des deux côtés de l'opérateur d'égalité avant la comparaison. Il semble que vous ayez obtenu une réponse sur la fonction LEN, mais je suis vraiment intéressé par une réponse plus approfondie que "les variables et l'égalité sont épineuses dans TSQ" pour la partie égalité de votre question.
0 votes
Oracle le fait aussi, je crois.
0 votes
En général, je trouve que stocker une chaîne vide est une mauvaise idée et c'est l'une des raisons. Je préfère l'utilisation de Null et je trouve de nombreux problèmes lorsque les gens essaient de transformer une information nulle en une valeur comme une chaîne vide ou une donnée hors de la plage normale.
0 votes
Je suis si heureuse qu'il fasse ça. Bien sûr, vous devriez couper les entrées de l'utilisateur et peut-être forcer null quand une chaîne vide est envoyée, mais vous pouvez avoir affaire à une ancienne base de données, ou vous pouvez simplement manquer cette logique pour un morceau de code. Il est agréable de pouvoir rechercher '' et null et de ne pas avoir à s'inquiéter s'il y a par erreur un espace dans le champ.