El operador = es T-SQL no es tanto "iguales" ya que es "son la misma palabra/frase, de acuerdo con la intercalación de la expresión de contexto, "y LEN es" el número de caracteres en la palabra/frase ". Ninguna intercalación trata los espacios en blanco finales como parte de la palabra/frase que los precede (aunque sí tratan los espacios en blanco iniciales como parte de la cadena que preceden).
Si necesita distinguir 'esto' de 'esto', no debe usar el operador "son la misma palabra o frase" porque 'this' y 'this' son la misma palabra.
La idea de que el operador de igualdad de cadenas dependa del contenido de sus argumentos y del contexto de intercalación de la expresión, pero no debe depender de los tipos de argumentos, si el son ambos tipos de cadenas.
El concepto del lenguaje natural de "estas son la misma palabra" no suele ser lo suficientemente preciso como para poder ser capturado por un operador matemático como =, y no hay ningún concepto de tipo de cadena en el lenguaje natural. El contexto (es decir, la intercalación) importa (y existe en el lenguaje natural) y es parte de la historia, y las propiedades adicionales (algunas que parecen peculiares) son parte de la definición de = para hacerlo bien definido en el mundo antinatural de datos.
En cuanto al problema de tipo, no le gustaría cambiar las palabras cuando están almacenadas en diferentes tipos de cadena. Por ejemplo, los tipos VARCHAR (10), CHAR (10) y CHAR (3) pueden contener representaciones de la palabra 'cat', y? = 'cat' debería permitirnos decidir si un valor de cualquiera de estos tipos contiene la palabra 'cat' (con problemas de caso y acento determinados por la intercalación).
respuesta al comentario de JohnFx:
Ver Using char and varchar Data en los libros en pantalla. Citando de esa página, énfasis mío:
Cada valor de datos char y varchar tiene una intercalación. Colaciones definen atributos tales como los patrones de bits utilizados para representar cada carácter, reglas de comparación y sensibilidad a la caja o acentuación.
Acepto que podría ser más fácil de encontrar, pero está documentado.
También vale la pena señalar que la semántica de SQL, donde = tiene que ver con los datos del mundo real y el contexto de la comparación (en lugar de bits almacenados en la computadora) ha sido parte de SQL para un largo tiempo. La premisa de RDBMS y SQL es la representación fiel de datos del mundo real, de ahí su apoyo para colaciones muchos años antes de que ideas similares (como CultureInfo) entraran en el reino de los lenguajes tipo Algol. La premisa de esos idiomas (al menos hasta hace muy poco) era la resolución de problemas en ingeniería, no la gestión de datos comerciales. (Recientemente, el uso de lenguajes similares en aplicaciones que no son de ingeniería como la búsqueda está haciendo algunas incursiones, pero Java, C#, etc. todavía están luchando con sus raíces no comerciales.)
En mi opinión, no es justo criticar SQL por ser diferente de "la mayoría de los lenguajes de programación". SQL se diseñó para admitir un marco para el modelado de datos empresariales que es muy diferente de la ingeniería, por lo que el lenguaje es diferente (y mejor para su objetivo).
Diablos, cuando SQL se especificó por primera vez, algunos idiomas no tenían ningún tipo de cadena incorporada. Y aún en algunos idiomas, el operador de igual entre cadenas no compara los datos de los caracteres, ¡pero compara las referencias! No me sorprendería si en una década o dos, la idea de que == depende de la cultura se convierte en la norma.
SQL 2005: select len ('') devuelve 0 – Mayo
Hace lo mismo en Sql Server 2000. –
Esta es una pregunta fascinante. Parece que vuelve igual sin importar cuántos espacios pongas en cada cadena, ya sea que coincidan o no. Después de más experimentación, noté que efectivamente está haciendo un RTRIM en ambos lados del operador de igualdad antes de la comparación. Parece que obtuvo una respuesta sobre la función LEN, pero estoy realmente interesado en una respuesta más completa que "varcharres e igualdad son espinosos en TSQ" para la parte de igualdad de su pregunta. – JohnFx