2011-06-25 49 views
3

我在表中聲明爲nvarchar(50)的表中有2個字段。在一些記錄中,該字段似乎具有相同的價值。 Howvever當我使用Where子句field1 <> field2,運行查詢時,發現字段不同。我嘗試使用where子句ltrim(rtrim(field1)) <> ltrim(rtrimfield2)),它仍然找到了一個區別。我很難過!比較NVarchar字段在SQL Server 2008 R2中

在此先感謝。

+0

如果你做了一個'SELECT'['+ yourColName +']''?也許有一些額外的拖尾特殊字符,你一開始沒有看到... –

+0

添加一些數據,請 – gbn

回答

2

當您使用來自不同語言的類似字母時,會發生這種情況。你不能識別他們的眼睛,但是不同...

例如,這是所有英文字母和Ελληνικά(埃拉斯),有些似乎相同,但不是。

ö<>ο
ý<>Υ
甲<>Α
Ë<>Ε

一些其它的具有小的但顯着的不同
ù<>υ
p <>ρ
i <>ι

所以這個'word'和''w0rd'不同,但是你看不到它。

PS我覺得這個問題,因爲你說「在一些記錄

1

除了@Aristos說的話,也有可能是字符,如非打破空間(U + 00A0)或零寬度空間(U + 200B),其未被修整爲LTRIM/RTRIM

+0

那麼我該如何糾正? – hoestang406

+0

@ hoestang406:這最後聽起來像*一個問題*。 :)首先,你需要確定你實際遇到了什麼樣的問題。基本上,我可能會使用像這樣的設備:'SELECT DISTINCT nvarcharExpr,CAST(nvarcharExpr AS varbinary)FROM ...',其中'nvarcharExpr'是類似於'UPPER(LTRIM(RTRIM(nvarcharColumn))')的結果。這樣我就可以看到'相同'值之間有什麼不同。接下來,我將使用REPLACE()函數來消除不可見字符和/或用正確的字母替換「假」字母(如果有的話)。 –

0

我遇到了同樣的問題。

我的表格包含名爲Definition的NVARCHAR(MAX)字段。數據庫中的當前字符串長度爲956個字符。

代碼調用數據並返回有效數據。 [東西發生]。更新命令是建立的,它使用WHERE子句中的Definition字段。零行更新。

我攔截了查詢並注意到當定義從where被排除時,UPDATE命令就會執行。

直接進入數據庫,我運行了一個簡單的SELECT定義FROM表WHERE Id = [無論id是什麼]。行被返回。

接下來,我從第一個結果複製了定義,並將查詢改爲了WHERE Definition ='[...]',並且沒有返回。

開始困惑,我改變了查詢,以便內部select通過Id獲取定義,並且外部對內部select的結果具有IN。這返回一行。

這導致我認爲在將文本(ASCII)與NVARCHAR(UNICODE)中的值進行比較時發生「問題」。

我仍然試圖得到答案。

*請不要評論我在代碼中建立查詢或奇怪的WHERE子句的事實。