2009-03-17 8 views
3

Angenommen, ein Tisch "myTable" mit drei Spalten benannt ist:Seltsames SQL-Verhalten, warum gibt diese Abfrage nichts zurück?

{**ID**(PK, int, not null), 
**X**(PK, int, not null), 
**Name**(nvarchar(256), not null)}. 

Let {4, 1, аккаунт} eine Aufzeichnung auf dem Tisch.

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'%аккаунт%' ) 

Die erste Abfrage gibt den Datensatz zurück, die zweite jedoch nicht? Warum?

Systeme, in denen diese Themen erfahren werden:

* Windows XP - Professional - Version 2002 - SP3
Server-Sortierungs: Latin1_General_CI_AS
Version: 9.00.3073.00
Level: SP2
Ausgabe: Entwickler-Edition

Sever Sortierungs: SQL_Latin1_General_CP1_CI_AS
Version: 9.00.3054.00
Level: SP2
Ausgabe: Enterprise Edition

Ergebnisse:

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 

Antwort

0

Ordnung, nach einer sehr viel Forschung, fand ich es in der Tat ein Problem auf den folgenden Versionen von SQL Server 2005 zu finden ist:

Windows XP - Professional - Version 2002 - SP3
Version: 9.00.3073.00
Level: SP2
Ausgabe: Developer Edition

Version: 9.00.3054.00
Level: SP2
Ausgabe: Enterprise Edition

.. kann auch andere Versionen sein.

FIX: Upgrade auf SP3.

1

Beide Abfragen geben das gleiche Ergebnis f oder ich.

select * from myTable as t 
where t.ID=4 
AND t.X = 1 
AND (t.Name = N'аккаунт') 

Returns:

ID   X   Name 
----------- ----------- ------------ 
4   1   аккаунт 

Und

select * from myTable as t 
where t.ID=4 
AND t.X = 1 
AND (t.Name LIKE N'%аккаунт%') 

Returns:

ID   X   Name 
----------- ----------- ------------ 
4   1   аккаунт 

(1 Zeile (n) betroffen)

Meine Version von SQL Server ist:

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) 

Meine Sortierungs ist eingestellt auf: SQL_Latin1_General_CP1_CI_AS

Meine Ergebnisse für Quassnoi: 0x30043A043A04300443043D04420400000000000000000000000000000000 0x30043A043A04300443043D04420400000000000000000000000000000000 0x250030043A043A04300443043D0442042500000000000000000000000000

(1 Zeile (n) betroffen)

+0

Diese Ergebnisse werden erwartet. @ Newbie's kyrillisches Literal wird in Fragezeichen umgewandelt, er hat höchstwahrscheinlich einige Probleme mit der Kodierung auf der Client-Seite. – Quassnoi

+0

Können Sie bitte sagen, welche Version von SQL Server Sie verwenden. Vielen Dank! – Newbie

3

Könnten Sie bitte das Ergebnis der folgenden Abfrage posten:

SELECT CAST(name AS BINARY), 
     CAST(N'аккаунт' AS BINARY), 
     CAST(N'%аккаунт%' AS BINARY) 
FROM myTable t 
WHERE t.ID = 4 
     AND t.X = 1 

Dies wird helfen, das Problem einzugrenzen.

UPDATE:

Wie ich aus den Ergebnissen der Abfrage sehen kann, Sie haben ein Problem mit Codierung.

Die kyrillischen Literale aus Ihren String-Konstanten werden in Fragezeichen umgewandelt (0x3F).

Leider kann ich dieses Verhalten mit Management Studio auf meinem Testserver nicht reproduzieren.

Ich denke, es gibt ein Problem mit OS Einstellungen, wie kyrillische Zeichen höchstwahrscheinlich nicht einmal erreichen SQL Server.

Könnten Sie bitte noch drei Fragen beantworten:

  1. Was OS sind Sie (Version, Sprache, MUI falls vorhanden) mit

    • Was diese Abfrage zurückgibt:

      SELECT SERVERPROPERTY ('SQLCharSetName')

    • Verbindung zu Ihrem Server mit osql.exe und geben Sie diese Abfrage:

      SELECT CAST (Name AS BINARY), CAST (N'аккаунт‘AS BINARY), CAST (N '% аккаунт%' AS BINARY) VON myTable t WHERE t.ID = 4
      UND tX = 1 GO

    Was ist in osql.exe laufen zurückkehren zu?

+0

Sie können jetzt die Ergebnisse sehen. Danke für die Hilfe! – Newbie

+0

Diese Abfragen funktionieren nicht direkt von Microsoft Sql Server Management Studio. – Newbie

+0

Microsoft SQL Server Management Studio \t 9.00.3042.00 – Newbie