Сравнение полей NVarchar в SQL Server 2008 R2 - PullRequest
3 голосов
/ 25 июня 2011

У меня есть 2 поля в таблице, объявленной как nvarchar(50).В нескольких записях поле имеет то же значение.Однако когда я запускаю запрос с предложением where field1 <> field2,, он обнаруживает, что поля разные.Я попытался использовать предложение where ltrim(rtrim(field1)) <> ltrim(rtrimfield2)), и оно все еще находит разницу.Я в тупике!

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 25 июня 2011

Это может произойти, если вы используете одинаковые буквы на разных языках. Вы не можете распознать их на глаз, но разные ...

Например, это все буквы на английском языке и Ελληνικά (Ellas), некоторые кажутся одинаковыми, но это не так.

о <> о
Y <> Υ
A <> Α
E <> Ε

некоторые другие имеют небольшие, но заметные отличия
ты <> υ
р <> р
я <> ι

Так что это 'слово' отличается от этого 'wórd' на 'o', но вы не можете его увидеть.

ps Я думаю, что это проблема, потому что вы говорите " в нескольких записях "

1 голос
/ 25 июня 2011

В дополнение к тому, что говорит @Aristos, это могут быть такие символы, как неразрывный пробел (U + 00A0) или пробел нулевой ширины (U + 200B), что не обрезаются на LTRIM / RTRIM.

0 голосов
/ 17 августа 2012

У меня такая же проблема.

Моя таблица содержит поле NVARCHAR (MAX) с именем Definition. Текущая строка в базе данных имеет длину 956 символов.

Код вызывает данные, и верные данные возвращаются. [Материал случается]. Команда update создана и использует поле Definition в предложении WHERE. Нулевые строки обновляются.

Я перехватил запрос и заметил, что, когда Определение исключено из где, выполняется команда UPDATE.

Переходя непосредственно к БД, я запустил простое определение SELECT FROM Table, где Id = [какой бы ни был идентификатор]. Строка возвращается.

Затем я скопировал определение из первого результата и изменил запрос на WHERE Definition = '[...]', и ничего не возвращается.

Начинаем путать, я изменил запрос так, чтобы внутренний выбор получал определение по Id, а внешний имел IN в результате внутреннего выбора. Это возвращает строку.

Это заставляет меня думать, что «проблема» возникает, когда вы сравниваете текст (ASCII) со значением в NVARCHAR (UNICODE).

Я все еще пытаюсь получить ответ.

* Пожалуйста, не комментируйте тот факт, что я строю запросы в коде или странное предложение WHERE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...