奇怪的SQL行为,这是为什么查询返回什么?
-
19-08-2019 - |
题
假设有一个表,名为"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
Edition: 开发版
切断排序规则: SQL_Latin1_General_CP1_CI_AS
版本: 9.00.3054.00
等级: SP2
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
好吧,研究了大量之后,我发现它确实是在SQL Server 2005中的以下版本中发现了一个问题:
Windows XP中 - 专业 - 2002年版 - SP3结果 版本:9.00.3073.00点击 等级:SP2结果 版:开发版结果
版本:9.00.3054.00结果 等级:SP2结果 版:企业版结果
..也可以是其它的版本。
FIX:升级到SP3
其他提示
能不能请你后的结果如下查询:
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
如果有任何)这是什么查询的回报:
选择SERVERPROPERTY('SQLCharSetName')
连接到你的服务器使用
osql.exe
和这个问题查询:选择投(名作为二进制), 投(N'аккаунт'作为二进制), 投(N'%аккаунт%'作为二进制) 从myTable t 在t.ID=4
和t。X=1 去
这是什么回报正在运行中
osql.exe
?
两个查询返回相同的结果,我
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行(一个或多个)受影响)