Странное поведение SQL, почему этот запрос ничего не возвращает?
-
19-08-2019 - |
Вопрос
Предположим, что существует таблица с именем "myTable", состоящая из трех столбцов:
{**ID**(PK, int, not null),
**X**(PK, int, not null),
**Name**(nvarchar(256), not null)}.
Пусть {4, 1, аккаунт} - запись в таблице.
select * from myTable as t
where t.ID=4
AND t.X = 1
AND ( t.Name = N'аккаунт' )
select * from myTable as t
where t.ID=4
AND t.X = 1
AND ( t.Name LIKE N'%аккаунт%' )
Однако первый запрос возвращает запись, а второй - нет?Почему?
Системы, в которых возникают подобные проблемы:
*Windows XP - Профессиональная - Версия 2002 - SP3
Параметры сортировки сервера: Латиноамериканский1_general_ci_as
Версия: 9.00.3073.00
Уровень: СП2
Издание: Версия для разработчиков
Разорвать Сопоставление: SQL_Latin1_General_CP1_CI_AS SQL_Latin1_General_CP1_CI_AS
Версия: 9.00.3054.00
Уровень: СП2
Издание: Корпоративная версия
Результаты:
SELECT SERVERPROPERTY('SQLCharSetName')
iso_1
Using OSQL.exe
0x30043A043A04300443043D04420400000000000000000000000000000000
0x3F3F3F3F3F3F3F0000000000000000000000000000000000000000000000
0x253F3F3F3F3F3F3F25000000000000000000000000000000000000000000
SELECT CAST(name AS BINARY),
CAST(N'аккаунт' AS BINARY),
CAST(N'%аккаунт%' AS BINARY)
FROM myTable t
WHERE t.ID = 4
AND t.X = 1
CAST(name AS BINARY)
0x30043A043A04300443043D04420400000000000000000000000000000000
CAST(N'аккаунт' AS BINARY)
0x3F3F3F3F3F3F3F0000000000000000000000000000000000000000000000
CAST(N'%аккаунт%' AS BINARY)
0x253F3F3F3F3F3F3F25000000000000000000000000000000000000000000
Решение 3
Хорошо, после долгих исследований я обнаружил, что это действительно проблема, обнаруженная в следующих версиях SQL Server 2005:
Windows XP - Профессиональная - Версия 2002 - SP3
Версия:9.00.3073.00
Уровень:СП2
Издание:Версия для разработчиков
Версия:9.00.3054.00
Уровень:СП2
Издание:Корпоративная версия
.. могут быть и другие версии.
ИСПРАВИТЬ:Обновитесь до версии SP3.
Другие советы
Не могли бы вы, пожалуйста, опубликовать результат следующего запроса:
SELECT CAST(name AS BINARY),
CAST(N'аккаунт' AS BINARY),
CAST(N'%аккаунт%' AS BINARY)
FROM myTable t
WHERE t.ID = 4
AND t.X = 1
Это поможет сузить круг проблем.
Обновить:
Как я вижу из результатов вашего запроса, у вас проблема с кодировкой.
Кириллические литералы из ваших строковых констант преобразуются в вопросительные знаки (0x3F
).
К сожалению, я не могу воспроизвести это поведение с помощью Management Studio
на моем тестовом сервере.
Я думаю, что есть какая-то проблема с OS
настройки, поскольку символы кириллицы, скорее всего, даже не достигают SQL Server
.
Не могли бы вы, пожалуйста, ответить еще на три вопроса:
Что
OS
используете ли вы (версию, язык,MUI
если таковые имеются)Что возвращает этот запрос:
ВЫБЕРИТЕ SERVERPROPERTY('SQLCharSetName')
Подключитесь к вашему серверу с помощью
osql.exe
и выдайте этот запрос:ВЫБЕРИТЕ ПРИВЕДЕНИЕ (имя КАК ДВОИЧНОЕ), ПРИВЕДЕНИЕ (N'аккаунт' КАК ДВОИЧНОЕ), ПРИВЕДЕНИЕ (N'%аккаунт%' КАК ДВОИЧНОЕ) Из myTable t ГДЕ t.ID = 4
И т.Д.X = 1 ИДИ
Что он возвращает при запуске
osql.exe
?
Оба запроса возвращают мне один и тот же результат.
select * from myTable as t
where t.ID=4
AND t.X = 1
AND (t.Name = N'аккаунт')
ВОЗВРАТ:
ID X Name
----------- ----------- ------------
4 1 аккаунт
И
select * from myTable as t
where t.ID=4
AND t.X = 1
AND (t.Name LIKE N'%аккаунт%')
ВОЗВРАТ:
ID X Name
----------- ----------- ------------
4 1 аккаунт
(затронута 1 строка (ы))
Моя версия SQL Server - это:
Microsoft SQL Server 2005 - 9.00.3077.00 (Intel X86)
Dec 17 2008 15:19:45
Copyright (c) 1988-2005 Microsoft Corporation
Express Edition on Windows NT 5.1 (Build 2600: Service Pack 3)
Моя сортировка установлена на: SQL_Latin1_General_CP1_CI_AS
Мои результаты для Quassnoi:0x30043A043A04300443043D04420400000000000000000000000000000000
0x30043A043A04300443043D04420400000000000000000000000000000000
0x250030043A043A04300443043D0442042500000000000000000000000000
(затронута 1 строка (ы))