Merkwürdiges beim LIKE-Vergleich?

19/03/2008 - 11:39 von Steffen Rzonsa | Report spam
Hallo NG,

das folgende SQL-Statement liefert unter MS SQL Server 2005 korrekt alle Adressen, deren Kurzname mit dem Buchstaben 'm' und 5 Ziffern beginnt.
SELECT Adressen.* FROM Adressen WHERE (Adressen.Kurzname like 'm[0-9][0-9][0-9][0-9][0-9]%')

Da zukünftig auf Unicode umgestellt werden soll, habe ich dem Vergleichsausdruck den Pràfix N vorangestellt:
SELECT Adressen.* FROM Adressen WHERE (Adressen.Kurzname like N'm[0-9][0-9][0-9][0-9][0-9]%')
Adressen.Kurzname hat jedoch (momentan) immer noch den Datentyp varchar(20).

Merkwürdigerweise erhalte ich dann als Ergebnis 0 Datensàtze!

Scheinbar ist die Ziffer '9' innerhalb des Vergleichsausdrucks ein Problem, denn eine modifizierte Abfrage (Ziffer '8' statt '9') liefert wie gewünscht mehrere Datensàtze als Ergebnis.
SELECT Adressen.* FROM Adressen WHERE (Adressen.Kurzname like N'm[0-8][0-8][0-8][0-8][0-8]%')

Kann mir das jemand erklàren?
Laut SQL-Server-Doku werden für LIKE automatisch alle Argumente in Unicode konvertiert, sobald eines der Argumente von einem Unicode-Datentypen ist.
Eine explizite Typ-Konvertierung möchte ich daher nicht durchführen...


Tschö Steffen
 

Lesen sie die antworten

#1 Robert Klemme
22/03/2008 - 13:59 | Warnen spam
On 19.03.2008 11:39, Steffen Rzonsa wrote:
Hallo NG,

das folgende SQL-Statement liefert unter MS SQL Server 2005 korrekt alle Adressen, deren Kurzname mit dem Buchstaben 'm' und 5 Ziffern beginnt.
SELECT Adressen.* FROM Adressen WHERE (Adressen.Kurzname like 'm[0-9][0-9][0-9][0-9][0-9]%')

Da zukünftig auf Unicode umgestellt werden soll, habe ich dem Vergleichsausdruck den Pràfix N vorangestellt:
SELECT Adressen.* FROM Adressen WHERE (Adressen.Kurzname like N'm[0-9][0-9][0-9][0-9][0-9]%')
Adressen.Kurzname hat jedoch (momentan) immer noch den Datentyp varchar(20).

Merkwürdigerweise erhalte ich dann als Ergebnis 0 Datensàtze!

Scheinbar ist die Ziffer '9' innerhalb des Vergleichsausdrucks ein Problem, denn eine modifizierte Abfrage (Ziffer '8' statt '9') liefert wie gewünscht mehrere Datensàtze als Ergebnis.
SELECT Adressen.* FROM Adressen WHERE (Adressen.Kurzname like N'm[0-8][0-8][0-8][0-8][0-8]%')

Kann mir das jemand erklàren?
Laut SQL-Server-Doku werden für LIKE automatisch alle Argumente in Unicode konvertiert, sobald eines der Argumente von einem Unicode-Datentypen ist.
Eine explizite Typ-Konvertierung möchte ich daher nicht durchführen...



Bedenke, dass die beiden Varianten von LIKE nicht identisch sind:

"Der Unicode-LIKE-Operator ist mit dem SQL-92-Standard kompatibel. Der
ASCII-LIKE-Operator ist mit früheren Versionen von SQL Server kompatibel."

http://msdn2.microsoft.com/de-de/li...79859.aspx

Ich habe gerade keinen SQL Server zur Hand, aber schau doch vielleicht
mal, ob in einer Unicode-Zeichenfolge bestimmte Zeichen besondere
Bedeutung haben und escaped werden müssen.

Ciao

robert

Ähnliche fragen