=运算符不是T-SQL,而是“等于”,而是“根据表达式上下文的校对是相同的单词/短语”,而LEN是“单词/短语中的字符数”。没有排序规则将尾随空格视为它们前面的单词/短语的一部分(尽管它们确实将前导空格视为它们前面的字符串的一部分)。
如果您需要将“ this”与“ this”区分开来,则不应使用“相同的单词或短语”运算符,因为“ this”和“ this”是相同的单词。
促成=工作方式的想法是,字符串相等运算符应取决于其参数的内容和表达式的排序规则上下文,但不应取决于参数的类型(如果它们都是字符串类型) 。
“这些是同一单词”的自然语言概念通常不够精确,无法被=等数学运算符捕获,自然语言中没有字符串类型的概念。上下文(即排序规则)很重要(并且以自然语言存在),并且是故事的一部分,而其他属性(某些看起来很古怪的属性)则是=定义的一部分,以使其在非自然世界中得到良好的定义。数据。
在类型问题上,当单词以不同的字符串类型存储时,您不希望更改它们。例如,类型VARCHAR(10),CHAR(10)和CHAR(3)都可以容纳单词'cat'的表示形式,而?='cat'应该让我们决定这些类型中的任何一个值是否包含单词'cat'(大小写和重音由排序规则确定)。
回应JohnFx的评论:
请参阅联机丛书中的使用char和varchar数据。从该页面引用,重点是:
每个char和varchar数据值都有一个排序规则。归类定义属性,例如用于表示每个字符的位模式,比较规则以及对大小写或重音符号的
敏感性。
我同意可能更容易找到,但已记录在案。
同样值得一提的是,SQL的语义(其中=与实际数据有关)和比较的上下文(与存储在计算机上的某些位相对)早已是SQL的一部分。RDBMS和SQL的前提是真实数据的忠实表示,因此,在类似概念(例如CultureInfo)进入类似Algol的语言领域之前,它就支持排序规则。这些语言(至少直到最近)的前提是解决工程问题,而不是管理业务数据。(最近,在非工程应用程序(例如搜索)中使用类似的语言已经取得了一些进展,但是Java,C#等仍在其非商业根源方面苦苦挣扎。)
在我看来,批评SQL与“大多数编程语言”不同是不公平的。SQL被设计为支持业务数据建模的框架,该框架与工程设计有很大的不同,因此语言是不同的(并且对于目标而言更好)。
哎呀,当第一次指定SQL时,某些语言没有任何内置的字符串类型。而且在某些语言中,字符串之间的equals运算符根本不比较字符数据,而是比较引用!如果再过一两年,==取决于文化的想法成为常态,这也不会令我感到惊讶。