奇怪的SQL行为,为什么这个查询什么都没有返回?

时间:2009-03-17 16:42:23

标签: sql sql-server-2005 unicode unicode-string

假设有一个名为“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
服务器排序规则: Latin1_General_CI_AS
版本: 9.00.3073.00
等级: SP2
版本:开发人员版

服务器整理: SQL_Latin1_General_CP1_CI_AS
版本: 9.00.3054.00
等级: SP2
版本:企业版

结果:

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 个答案:

答案 0 :(得分: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

这将有助于缩小问题范围。

<强>更新

正如我从查询结果中看到的那样,您遇到编码问题。

您的字符串常量中的西里尔文字正在转换为问号(0x3F)。

不幸的是,我无法在我的测试服务器上使用Management Studio重现此行为。

我认为OS设置存在一些问题,因为西里尔字符很可能甚至无法达到SQL Server

请你再回答三个问题:

  1. 您使用的是什么OS(版本,语言,MUI,如果有的话)

    • 此查询返回的内容:

      SELECT SERVERPROPERTY('SQLCharSetName')

    • 使用osql.exe连接到您的服务器并发出以下查询:

      SELECT CAST(name AS BINARY),        CAST(N'аккаунт'ASBINARY),        CAST(N'%аккаунт%'作为二进制) 来自myTable t 在哪里t = ID = 4        AND t.X = 1 GO

    它在osql.exe中运行的是什么?

答案 1 :(得分:1)

两个查询都会为我返回相同的结果。

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行受影响)

答案 2 :(得分:0)

好的,经过大量的研究,我发现在以下版本的SQL Server 2005中确实存在问题:

Windows XP - 专业版 - 2002版 - SP3
版本:9.00.3073.00
等级:SP2
版本:开发人员版本

版本:9.00.3054.00
等级:SP2
版本:企业版

..也可能是其他版本。

FIX:升级到SP3。