= 运算符在 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 时,一些语言没有任何内置的字符串类型。而且在某些语言中,字符串之间的等号运算符根本不比较字符数据,而是比较引用!如果再过一两年,== 依赖于文化的想法成为常态,我不会感到惊讶。