Weird-SQL-Verhalten, warum kehrt diese Abfrage nichts?
-
19-08-2019 - |
Frage
Angenommen, eine Tabelle „myTable“ mit drei Spalten benannt ist:
{**ID**(PK, int, not null),
**X**(PK, int, not null),
**Name**(nvarchar(256), not null)}.
Es sei {4, 1, аккаунт} auf dem Tisch ein Rekord sein.
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 den Datensatz zurückkehren, jedoch der zweite 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: Developer 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
Lösung 3
In Ordnung, nach einem sehr vieler Forschung, fand ich es ist in der Tat ein Problem auf den folgenden Versionen von SQL Server gefunden 2005:
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
.. Es können auch andere Versionen sein.
UPDATE:. Upgrade auf SP3
Andere Tipps
Könnten Sie bitte das Ergebnis der folgenden Abfrage schreiben:
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 dazu beitragen, das Problem zu verengen.
UPDATE:
Wie ich aus den Ergebnissen der Abfrage sehen kann, haben Sie ein Problem mit Codierung.
Die kyrillische Literale aus dem String-Konstanten auf die Fragezeichen umgewandelt werden (0x3F
).
Leider kann ich dieses Verhalten nicht reproduzieren mit Management Studio
auf meinem Test-Server.
Ich denke, es gibt ein Problem mit OS
Einstellungen ist, als kyrillische Zeichen höchstwahrscheinlich auch nicht SQL Server
erreichen.
Könnten Sie bitte beantworten drei weitere Fragen:
-
Was
OS
sind Sie (Version, Sprache,MUI
falls vorhanden)-
Was bedeutet diese Abfrage Rückkehr:
SELECT SERVER ( 'SQLCharSetName')
-
Eine Verbindung mit dem Server mit
osql.exe
und gibt diese Abfrage:SELECT CAST (Name AS BINARY), CAST (N'аккаунт‘AS BINARY), CAST (N '% аккаунт%' AS BINARY) VON myTable t WHERE t.ID = 4
UND T. x = 1 GO
Was sie zurückkehrt, wird in
osql.exe
laufen? -
Beide Abfragen geben das gleiche Ergebnis für mich.
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)