none
Probleme mit Umlauten bei Vergleich mit LIKE RRS feed

  • 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

    Donnerstag, 11. September 2014 18:29

Antworten

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.


    Donnerstag, 11. September 2014 18:50
  • 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

    Donnerstag, 11. September 2014 19:00
    Beantworter
  • 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
    Freitag, 12. September 2014 05:52
  • 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

    Freitag, 12. September 2014 06:16
  • 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
    Freitag, 12. September 2014 07:39
    Beantworter
  • 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
    Freitag, 12. September 2014 09:40
  • Hallo,

    bitte markiere die Antworten, die Dir geholfen haben, siehe

    Wozu Antworten markieren und für Beiträge abstimmen?

    Gruß Elmar

    Freitag, 12. September 2014 09:59
    Beantworter