在SQL Server 2008 R2中比较NVarchar字段

3

我有一张表中声明了两个字段,类型为nvarchar(50)。在其中一些记录中,这两个字段的值看起来是相同的。但是当我运行带有条件field1 <> field2的查询时,它会发现这两个字段是不同的。我尝试使用ltrim(rtrim(field1)) <> ltrim(rtrimfield2))作为条件语句,但它仍然找到了差异。我被难住了!

提前感谢。


如果你执行 SELECT '[' + yourColName + ']' 会怎么样??也许有一些额外的尾随特殊字符,你一开始看不到... - marc_s
3个回答

2
当你使用来自不同语言的相似字母时,就会发生这种情况。你不能用肉眼识别它们,但它们是不同的...
例如,这些都是英文和希腊文(Ellas)中的字母,有些看起来相同,但实际上不同。
o <> ο Y <> Υ A <> Α E <> Ε
还有一些字母有微小但明显的区别。 u <> υ p <> ρ i <> ι
因此,这个“word”和这个“wοrd”在字母“o”上是不同的,但你看不出来。
附注:我认为这个问题是因为你说“在少数记录中”。

1
除了@Aristos所说的之外,还可能是像不换行空格(U+00A0)或零宽度空格(U+200B)这样的字符,它们不会被LTRIM/ RTRIM 去除空格。

@hoestang406:这终于听起来像是一个问题了。首先,你需要确定你实际上遇到了什么样的问题。基本上,我可能会使用这样的设备:SELECT DISTINCT nvarcharExpr, CAST(nvarcharExpr AS varbinary) FROM…,其中 nvarcharExpr 将是类似于 UPPER(LTRIM(RTRIM(nvarcharColumn))) 的结果。这样我就能看到“相同”值之间的差异。接下来,我将使用 REPLACE() 函数消除不可见字符和/或用正确的字符替换“假”的字母(如果有的话)。 - Andriy M

0

我遇到了同样的问题。

我的表中包含一个名为Definition的NVARCHAR(MAX)字段。数据库中当前字符串长度为956个字符。

代码调用数据并返回有效数据。[发生了一些事情]。更新命令被构建,并在WHERE子句中使用Definition字段。零行被更新。

我拦截了查询并注意到当排除Definition时,UPDATE命令执行。

直接访问数据库后,我运行了一个简单的SELECT Definition FROM Table WHERE Id = [无论id是什么]。行被返回。

接下来,我从第一个结果中复制了Definition并修改了查询以WHERE Definition ='[...]',但没有返回任何内容。

开始感到困惑,我修改了查询,使内部选择通过Id获取定义,外部对内部选择的结果进行IN操作。那样就会返回一行。

这让我认为,“问题”出现在将文本(ASCII)与NVARCHAR(UNICODE)中的值进行比较时。

我仍在努力寻找答案。

*请不要评论我在代码中构建查询或奇怪的WHERE子句的事实。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接