WernerK: Fehlerhafte Umlaute reparieren

Hallo
vermutlich durch einen fehlerhaften Import und falsche Kodierung stehen in einer Tabelle Sonderzeichen wie folgt drin (angeschaut mit PhpMyAdmin)

--Ihre Datei ist zu gro�
--Bitte w�hlen Sie eine kleinere Datei

Bevor ich nun manuell die DB nach weiteren Fehlern durchsuche und manuell update, dachte ich, ich frag mal hier, ob es eine Lösung gibt dies automatisch zu reparieren?

Gefunden habe ich unter anderem diesen Ansatz:

http://pr11.de/mysql-umlaute-reparieren.html

Wenn ich es jedoch so versuche, wird nichts ersetzt
update mein_tabelle set
  german=replace(german,"ä", "ä")

Ich vermute der Autor ging von einer anderen falschen Kodierung aus.

Hat jemand eine Idee, ob man dies irgendwie elegant "automatisch" reparieren kann, ohne wirklich jede Zeile direkt upzudaten?

Gruss
werner

  1. Tach!

    Bevor ich nun manuell die DB nach weiteren Fehlern durchsuche und manuell update, dachte ich, ich frag mal hier, ob es eine Lösung gibt dies automatisch zu reparieren?

    Reparieren heißt, zunächst nachzuschauen, was genau kaputt ist, dann kann man es gezielt ausbessern. Auch bei Verlusten durch fehlerhafte Zeichenkodierungen gibt es kein für alle Lebenslagen gültiges Reperaturrezept.

    Gefunden habe ich unter anderem diesen Ansatz:
    http://pr11.de/mysql-umlaute-reparieren.html
    Wenn ich es jedoch so versuche, wird nichts ersetzt
    Ich vermute der Autor ging von einer anderen falschen Kodierung aus.

    Ja, er hatte UTF-8-kodierte Daten gesendet, dem DBMS aber gesagt (oder es aufgrund seiner Defaultkonfiguration glauben lassen), es sei Latin1/ISO-8859-1. Oder aber er hat doppelt UTF-8-kodierte Daten gesendet und MySQL ging von UTF-8 aus.

    Hat jemand eine Idee, ob man dies irgendwie elegant "automatisch" reparieren kann, ohne wirklich jede Zeile direkt upzudaten?
    --Ihre Datei ist zu gro�
    --Bitte w�hlen Sie eine kleinere Datei

    Das sieht eher so aus, als ob jemand UTF-8 anzeigen soll, aber ISO-8859-1 bekommt. Denn dann kommt an der Stelle des Umlauts eine ungültige UTF-8-Sequenz, was zu diesem � führt.

    Vorschlag zur Vorgehensweise: Frag einen dieser Datensätze mit PHP ab. Gib aber direkt nach dem Connect mit mysql_set_charset('latin1'), dass du Latin1 haben möchtest. Gib das Ergebnis mal mit urlencode() aus, um die Bytes des Umlautes anzusehen. Wenn das nur zum Fragezeichen führt (oder %3F), dann wiederhol das nochmal, aber mit 'utf8' statt 'latin1'. Abhängig vom Ergebnis kann man dann weitersehen.

    dedlfix.

    1. Hallo,

      danke für deine Ideen.
      also;

      Ich mache das Ganze mit PDO.

      Mit $DBO->query("SET NAMES 'utf8'")  (PHP Webseite ist in UTF-8 )

      wird aus "gro�"  mit echo urlencode("Text ist $test <br>");

      gro%EF%BF%BD+%3Cbr%3E

      mit SET NAMES 'latin1' bekomme ich

      gro%3F+%3Cbr%3E

      angezeigt.

      Gruss
      Werner

      1. Tach!

        wird aus "gro�"  mit echo urlencode("Text ist $test <br>");

        Du brauchst nur $test durch urlencode() zu schicken. Und es ist nur eine Kontrollausgabe. Jeder überflüssige Code ist da nur unnötige Mehrarbeit.

        gro%EF%BF%BD

        Da ist die UTF-8-Sequenz für das Zeichen � zu sehen.

        mit SET NAMES 'latin1' bekomme ich
        gro%3F

        Und das ist ein Fragezeichen. Aus beiden kannst du die Umlaute nicht wiederherstellen. Das sieht danach aus, als ob der Import ISO-8859-1/Latin1-kodiert war, aber als UTF-8 deklariert importiert wurde. Dabei bilden unter anderem die Umlaute ungültige UTF-8-Sequenzen und stattdessen wird dann dieses �-Zeichen verwendet. Die ISO-8859-1-zu-UTF-8-Konvertierung fand dabei sehr wahrscheinlich vor dem eigentlichen Import statt, denn wenn man MySQL direkt ungültiges UTF-8 sendet, schneidet es an der Stelle den Reststring ab und trägt nur den Teil bis dahin ein. Das Abschneiden ist jedoch bei dir nicht der Fall.

        dedlfix.