Странное поведение SQL, почему этот запрос ничего не возвращает?

StackOverflow https://stackoverflow.com/questions/655053

Вопрос

Предположим, что существует таблица с именем "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.

Не могли бы вы, пожалуйста, ответить еще на три вопроса:

  1. Что 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 строка (ы))

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top