【问题标题】:Weird SQL Behavior, why is this query returning nothing?奇怪的 SQL 行为,为什么这个查询什么都不返回?
【发布时间】:2009-03-17 16:42:23
【问题描述】:

假设有一个名为“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

【问题讨论】:

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


    【解决方案1】:

    能否请您发布以下查询的结果:

    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 连接到您的服务器并发出以下查询:

        选择 CAST(名称为二进制), CAST(N'аккаунт' AS BINARY), CAST(N'%аккаунт%' 作为二进制) FROM myTable t 其中 t.ID = 4
        和 t.X = 1 去吧

      osql.exe 中运行会返回什么?

    【讨论】:

    • 你现在可以看到结果了。感谢您的帮助!
    • 此查询在 Microsoft Sql Server Management Studio 下无法正常工作。
    • Microsoft SQL Server Management Studio 9.00.3042.00
    • 我已添加您要求的信息。谢谢您的帮助。我已经从你那里学到了一些东西。再次感谢!
    • 不客气,但很遗憾我仍然无法重现您的问题。我手头没有带有 ISO_1 服务器编码的 SQL Server,而且在 SQL Server 2005 俄语版上一切正常。
    【解决方案2】:

    两个查询对我返回相同的结果。

    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 行)

    【讨论】:

    • 这是预期结果。 @Newbie 的西里尔文字被转换为问号,他很可能在客户端的编码方面存在一些问题。
    • 能否告诉您您使用的是什么版本的 SQL Server。谢谢!
    【解决方案3】:

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

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

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

    ..也可能是其他版本。

    修复:升级到 SP3。

    【讨论】:

      猜你喜欢
      • 2019-12-11
      • 1970-01-01
      • 1970-01-01
      • 2021-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多