2015-02-06 2 views
0

У меня есть довольно странная проблема в SQL Server (версия 12.0.2000.8, collation - Hungarian_CI_AS): У меня есть таблица с столбцом с нулевым значением varchar (128), который хранит usernames, , и я просто не могу сопоставить ни один из них с простым оператором '='. Итак, когда я выполняю такой запрос: select * from myTable where username = 'john.doe', он не возвращает никаких строк.Идентификация строки SQL-сервера по сравнению с CHAR (0)

Я обнаружил, что, когда я выбираю то же самое с LIKE и положить% в заднем полукоксе, так: select * from myTable where username = 'john.doe%', он работает отлично.

Таким образом, я создал запрос, который заменяет весь полукокс (0) -s со знаками «$», выглядит следующим образом:

select REPLACE(username, CHAR(0), '$') from myTable 
where username LIKE 'john.doe%' 

и возвращает 128 долго буквальный, как это (фаршированным trailing $ -s): john.doe $$$$$$$$$$

Учитывая вышеизложенные факты, я подозревал, что почему-то проблема с char (0) - это проблема, но когда Я запускаю простой запрос для моделирования тех же условий для оператора «=», я получаю, что 2 литерала равны:

SELECT CASE WHEN ('john.doe') = ('john.doe' + CHAR(0) + CHAR(0) + CHAR(0)) THEN 'Equal' ELSE 'Not Equal' END 

Этот запрос возвращает Equal.

Так что я совершенно смущен, что здесь происходит? И что мне делать, чтобы оператор '=' работал в моей таблице базы данных?

+1

Для меня ваш тестовый запрос возвращает «Не равно», как и должно быть. –

+0

Ну, теперь проблема усложняется. :) Могу ли я спросить, какая версия сервера sql и какая сортировка вы используете? – user1307533

+0

Это не должно иметь значения. Добавление конечного символа 'char (0)' должно сделать строку другой. Сравнение '=' игнорирует только конечные пробелы, все остальные символы должны быть приняты во внимание. Я использую SQL Server 2008 10.0.6000.29, Latin1_General_CI_AS –

ответ

1

Попробуйте изменить тип данных столбца в таблице на nvarchar (128) вместо varchar (128). Это может магически решить проблему (даже если запросы не будут использовать префикс N), но я не могу объяснить, почему. Похоже, что существует фундаментальная разница в обработке CHAR (0) между типами данных varchar и nvarchar.

+0

Спасибо, что работает как шарм :) – user1307533

Смежные вопросы