假设有一个名为“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
答案 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
。
请你再回答三个问题:
您使用的是什么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。