Benutzer mit den meisten Antworten
Probleme mit Umlauten bei Vergleich mit LIKE

Frage
-
Sehr geehrte Damen und Herren,
ich habe folgendes Problem: Folgender Vergleich schlägt fehl, wenn ich Umlaute verwende;
WHERE Titel LIKE '%' + @FilterText + '%'
Funktioniert erwartungsgemäß, falls die Zeichenkette @FilterText keine Umlaute enthält, andernfalls nicht.
(hart kodiert, z.B. LIKE '%Europäisch%' funktioniert)
Es muss etwas mit verschiedenen Zeichensätzen zu tun haben, ich habe aber erst einmal keine Idee, wie ich da weiterkomme.
Die Kodierung der ASP.NET-Website ist UTF-8.
Vielleicht können Sie mir helfen?
MfG
Antworten
-
Hallo,
Es ist nicht notwendig, die Seite auf Unicode (UTF-16) einzustellen, denn eine Umsetzung von UTF-8 in UTF-16 und umgekehrt ist verlustfrei möglich.
Dein Problem liegt auf der ASP.NET Seite. Denn der TitelText wird nicht als UTF-8 übertragen - das (durch Escape) codierte "%DF" ist eine ANSI Kodierung wie ISO8859-1 usw:
Siehe http://stackoverflow.com/questions/75980/best-practice-escape-or-encodeuri-encodeuricomponent
und ggf. auch: Umlaute werden in Webseite falsch, aber in Visual Studio korrekt dargestellt
Gruß Elmar
- Als Antwort markiert iMaXX Freitag, 12. September 2014 16:09
-
Hallo,
statt auf der Clientseite
var sFilterText = escape(oTitel.value);
jetzt
var sFilterText = encodeURI(oTitel.value);
und es funktioniert.
Auf Serverseite blieb es bei
sTitelFilterText = Server.UrlDecode(Request.QueryString("TitelText"))
Vielen Dank!
MFG
- Als Antwort markiert iMaXX Freitag, 12. September 2014 09:41
Alle Antworten
-
was ist die Deklaration der Spalte Titel und der Variable FilterText?
ich wuerde mal dies
WHERE Titel LIKE N'%' + @FilterText + N'%'
probieren - damit wird der zusammengesetzt Text als Unicodestring und nicht als ASCI String behandelt.
Please use Mark as Answer if my post solved your problem and use Vote As Helpful if a post was useful.
- Bearbeitet Daniel_Steiner Donnerstag, 11. September 2014 18:51
-
Hallo,
der SQL Server kann nichts mit UTF-8 anfangen. Damit der Vergleich funktioniert musst Du die Daten als Unicode (UTF-16) senden.
Bei ASP.NET üblicherweise mit einem SqlParameter vom Type SqlDbType.NVarChar, siehe Konfigurieren von Parametern und Parameterdatentypen. Die Anweisung sollte vollständig in Unicode sein - beachte das "N" vor den Literalen:
WHERE Titel LIKE N'%' + @FilterText +N'%'
Günstigerweise wäre die Spalte Titel ebenfalls als Unicode (NVarChar) angelegt.
Gruß Elmar
- Als Antwort vorgeschlagen Bodo Michael Danitz Donnerstag, 11. September 2014 21:50
-
Hallo und vielen Dank,
auf "N'%'" wäre ich nicht gekommen - eigentlich klar. Nur scheint das noch nicht zu reichen.
Nebenbei: Alle Strings sind als nvarchar definiert, also "Titel" und "@FilterText".Der Vergleich lautet nun
WHERE ('' = @TitelText OR LVB1.Titel LIKE N'%' + @TitelText + N'%' )
Hier der Weg des Filtertextes, beginnend beim Input:
1.
Das Input-Feld "oText" enthält "Auß".2.
In Javascript wird der Filtertext wie folgt kodiert:sFilterText = escape(oText.value);
sFilterText enthält "Au%DF".
Anschließend wird der Filtertext im QueryString des Aufrufes einer ASPX-Seite übergeben.
3.
Auf Serverseite passiert nun folgendes:sTitelFilterText = Server.UrlDecode(Request.QueryString("TitelText"))
"sTitelFilterText" enthält "Au�" -> Das sollte das Problem sein.
Auch ein anschließendes
sTitelFilterText = Encoding.Unicode.GetString(Encoding.Unicode.GetBytes(sTitelFilterText))
hilft nicht weiter, d.h. "sTitelFilterText" enthält weiterhin "Au�".
Wenn ich das "Auß" auf der Serverseite hart kodiere,
sTitelFilterText = "Auß"
dann kommt das gewünschte Ergebnis!
Nebenbemerkung: Ich kann die Seite nicht auf UTF-16 umstellen. Welche Alternativen habe ich denn da?
MfG
- Bearbeitet iMaXX Freitag, 12. September 2014 05:55 Ergänzung
-
Wenn Du die Umlaute mit escape() umsetzt, musst Du sie vor dem SELECT wieder zurück umsetzen. Das geht z. B. mit
replace(@sFilterText, '%DF', 'ß')
Einen schönen Tag noch,
Christoph
--
Microsoft SQL Server MVP - http://www.insidesql.org/blogs/cmu -
Hallo,
Es ist nicht notwendig, die Seite auf Unicode (UTF-16) einzustellen, denn eine Umsetzung von UTF-8 in UTF-16 und umgekehrt ist verlustfrei möglich.
Dein Problem liegt auf der ASP.NET Seite. Denn der TitelText wird nicht als UTF-8 übertragen - das (durch Escape) codierte "%DF" ist eine ANSI Kodierung wie ISO8859-1 usw:
Siehe http://stackoverflow.com/questions/75980/best-practice-escape-or-encodeuri-encodeuricomponent
und ggf. auch: Umlaute werden in Webseite falsch, aber in Visual Studio korrekt dargestellt
Gruß Elmar
- Als Antwort markiert iMaXX Freitag, 12. September 2014 16:09
-
Hallo,
statt auf der Clientseite
var sFilterText = escape(oTitel.value);
jetzt
var sFilterText = encodeURI(oTitel.value);
und es funktioniert.
Auf Serverseite blieb es bei
sTitelFilterText = Server.UrlDecode(Request.QueryString("TitelText"))
Vielen Dank!
MFG
- Als Antwort markiert iMaXX Freitag, 12. September 2014 09:41
-
Hallo,
bitte markiere die Antworten, die Dir geholfen haben, siehe
Wozu Antworten markieren und für Beiträge abstimmen?
Gruß Elmar