3

假设有一个名为“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
版本:开发人员版

服务器排序: 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
4

3 回答 3

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'аккаунт' AS BINARY), CAST(N'%аккаунт%' AS BINARY) from myTable t WHERE t.ID = 4
      AND tX = 1 GO

    它在运行时返回什么osql.exe

于 2009-03-17T17:03:32.723 回答
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 行受影响)

于 2009-03-17T16:48:49.203 回答
0

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

Windows XP - 专业版 - 2002 版 - SP3
版本:9.00.3073.00
级别:SP2
版:开发者版

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

..也可能是其他版本。

修复:升级到 SP3。

于 2009-04-14T16:08:28.587 回答