2009-03-17 3 views
3

Предположим, что имеется таблица с именем "MyTable" с тремя столбцами:Weird SQL Behavior, почему этот запрос ничего не возвращает?

{**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
Сервер Collation: Latin1_General_CI_AS
Версия: 9.00.3073.00
Уровень: SP2
Издание: Редакция разработчика

Sever Collation: SQL_Latin1_General_CP1_CI_AS
Версия: 9.00.3054.00
Уровень: SP2
Издание: 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 

ответ

0

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

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

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

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

Исправить: перейти на SP3.

1

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

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 строка (s) пострадавшие)

+0

Ожидаемые результаты. @ Кириллический литерал новичка преобразуется в вопросительные знаки, у него, скорее всего, есть некоторые проблемы с кодированием на стороне клиента. – Quassnoi

+0

Не могли бы вы рассказать, какую версию SQL-сервера вы используете. Благодаря! – Newbie

3

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

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 если есть)

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

      SELECT SERVERPROPERTY ('SQLCharSetName')

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

      SELECT CAST (имя AS BINARY), CAST (N'аккаунт»AS BINARY), CAST (N '%% аккаунт' AS BINARY) ОТ MYTABLE т WHERE t.ID = 4
      ПРД = 1 GO

    Что это возвращение запущен в osql.exe?

+0

Теперь вы можете увидеть результаты. Спасибо за помощь! – Newbie

+0

Эти запросы не работают сразу с Microsoft Sql Server Management Studio. – Newbie

+0

Microsoft SQL Server Management Studio \t 9.00.3042.00 – Newbie

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