Странное поведение SQL, почему этот запрос ничего не возвращает? - PullRequest
3 голосов
/ 17 марта 2009

Предположим, есть таблица с именем "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 - Professional - Версия 2002 - SP3
Сортировка сервера: Latin1_General_CI_AS
Версия: 9.00.3073.00
Уровень: SP2
Edition: Developer Edition

Разобрать параметры сортировки: SQL_Latin1_General_CP1_CI_AS
Версия: 9.00.3054.00
Уровень: SP2
Edition: Enterprise Edition

Результаты:

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 ]

3 голосов
/ 17 марта 2009

Не могли бы вы опубликовать результат следующего запроса:

SELECT CAST(name AS BINARY),
       CAST(N'аккаунт' AS BINARY),
       CAST(N'%аккаунт%' AS BINARY)
FROM   myTable t
WHERE  t.ID = 4  
       AND t.X = 1

Это поможет сузить проблему.

UPDATE:

Как видно из результатов вашего запроса, у вас проблема с кодировкой.

Буквы кириллицы из ваших строковых констант преобразуются в знаки вопроса (0x3F).

К сожалению, я не могу воспроизвести это поведение с помощью Management Studio на моем тестовом сервере.

Я считаю, что есть некоторые проблемы с настройками OS, так как кириллические символы, скорее всего, даже не достигают SQL Server.

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

  1. Что OS вы используете (версия, язык, MUI, если есть)

    • Что возвращает этот запрос:

      ВЫБРАТЬ НЕДВИЖИМОСТЬ СЕРВЕРА ('SQLCharSetName')

    • Подключитесь к вашему серверу с помощью osql.exe и выполните этот запрос:

      SELECT CAST (название как BINARY), CAST (N'аккаунт 'AS BINARY), CAST (N '% аккаунт%' AS BINARY) ОТ myTable t ГДЕ t.ID = 4
      И t.X = 1 GO

    Что он возвращает, будучи запущенным в osql.exe?

1 голос
/ 17 марта 2009

Оба запроса возвращают один и тот же результат для меня.

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 ряд)

0 голосов
/ 14 апреля 2009

Хорошо, после долгих исследований я обнаружил, что это действительно проблема, обнаруженная в следующих версиях SQL Server 2005:

Windows XP - Professional - Версия 2002 - SP3
Версия: 9.00.3073.00
Уровень: SP2
Издание: Developer Edition

Версия: 9.00.3054.00
Уровень: SP2
Издание: Enterprise Edition

.. могут быть и другие версии.

ИСПРАВЛЕНИЕ: Обновление до SP3.

...