Gero: Problem mit utf8 bei MySQL Transfer

Hallo,

ich habe zwei MySQL Datenbanken. ich möchte gern Inhalte von der einen zur anderen Übertragen. Doch versaut mir dieser Transfer mein deutschen zeichen (ä,ö,ü, etc)

Ich habe folgendes probiert:

$entry1 = utf8_decode($row->message);  
$eintrag1 = "INSERT INTO......VALUES ('$entry1',...

Nun wird aus "für" ein "f?". Bei meinen Versuchen vorher waren es seltsame Zeichen.

Da ich mir nicht sicher war, habe ich vorher mal diesen Schnipsel gebastelt und dieser hat funktioniert.

<?php  
$a = "für ";  
echo utf8_decode($a);  
  
?>

Was mache ich falsch und wo kann ich entsprechende Themen finden?

Vielen Dank

  1. Hallo,

    ich habe zwei MySQL Datenbanken. ich möchte gern Inhalte von der einen zur anderen Übertragen. Doch versaut mir dieser Transfer mein deutschen zeichen (ä,ö,ü, etc)

    Das ist ein umfangreiches Thema, dem ich mich mit vielen Versuchen und Irrtümern genähert habe, da mir die Systematik auch nicht ganz klar ist.

    Du musst den Transfer in viele Schritte zerlegen und bei jedem Schritt testen, ob du noch den gewünschten Zeichensatz hast:

    Datenbank_quelle hat intern Zeichensatz UTF-8 (oder andere)

    >> @mysql_query( "SET NAMES 'utf8'", $conn_id_1 );
    Datenbank_quelle gibt aus Zeichensatz UTF-8 (oder andere)

    >> mb_internal_encoding("UTF-8");
    Programm ist auch auf UTF-8 (oder andere) eingestellt

    >> @mysql_query( "SET NAMES 'utf8'", $conn_id_2 );
    Datenbank_ziel erwartet als Eingabe Zeichensatz UTF-8 (oder andere)

    Datenbank_ziel hat intern Zeichensatz UTF-8 (oder andere)

    Kann sein, dass ich was übersehen habe, aber so klappt's bei mir. Und dann wäre wohl auch die Umsetzung von einem Zeihensatz zu einem anderen denkbar. Ich weiss allerdings nicht, was eine "lateinische" Datenbank macht, wenn kyrillischer input kommt.

    Gruß, Kalle

    1. Hi Kalle,

      danke erstmal für Deine Antwort. Jetzt wird alles ab dem deutschem Zeichen abgeschnitten :)

      Ist ja echt umständlich diese Zeichensatzgeschichte ;)

      Gruß

      Gero

    2. Hallo!

      Kann sein, dass ich was übersehen habe,

      Mittel mysql_set_charset kannst du die Zeichenkodierung für eine Verbindung zum MySQL-Server setzen. Die aktuelle kodierung verrät Dir mysql_client_encoding.

      Ciao
      GG

      --
      "If I do not seek to understand what is happening here
      - then I've got peanuts in my head!"
      (I. Hosein)
    3. Moin!

      Du musst den Transfer in viele Schritte zerlegen und bei jedem Schritt testen, ob du noch den gewünschten Zeichensatz hast:

      Nein, so kompliziert ist es nicht.

      PHP verhält sich hinsichtlich des Encodings in seinen Strings neutral, die Bytes werden nicht geändert.

      Deshalb ist auch dein mb_internal_encoding() hier irrelevant, weil das sich nur auswirkt, wenn mb_*-Funktionen benutzt werden - bei MySQL-Querys ist das nicht der Fall.

      Wichtig ist aber, jeder DB-Connection mitzuteilen, mit welchem Encoding man den kommunizieren will - also "SET NAMES 'utf8'".

      Wenn das auf beide Connections angewendet wird (einmal nach Verbindungsaufbau), steht PHP-seitig einem Kopieren der Daten von A nach B nichts im Weg, das sollte so problemlos funktionieren. Übrigens auch unabhängig von der gewählten Kollation der Spalten - MySQL codiert das um, deswegen ja das SET NAMES.

      Schwieriger wird es natürlich, wenn auch noch eine Textausgabe auf eine Webseite gewünscht ist. Dann ist auch dort das korrekte Encoding zu setzen, Fehldarstellungen haben aber keinerlei Aussagekraft über die Korrektheit der DB-Kopieroperation.

      Im übrigen möchte ich darauf hinweisen, dass man durchaus auch zwei Datenbanken auf EINEM Server über genau EINE Connection bearbeiten kann: "SELECT db1.tabelle1.spalte, db2.tabelle1.spalte FROM db1.tabelle1 JOIN db2.tabelle1 ON db1.tabelle1.spalte = db2.tabelle1.spalte ..."

      - Sven Rautenberg

      1. Moin!

        Deshalb ist auch dein mb_internal_encoding() hier irrelevant, weil das sich nur auswirkt, wenn mb_*-Funktionen benutzt werden - bei MySQL-Querys ist das nicht der Fall.

        Okay, ich nutze mb_* Funktionen. Und damit es nicht vergessen wird, habe ich das mb_internal_encoding() grundsätzlich drin, ob es nun in diesem Programm gebraucht wird oder nicht.

        Spart das den zusätzlichen Parameter "UTF8" (oder heisst das UTF-8 oder utf8 oder utf-8) in den mb_* ?

        Aber eigentlich habe ich so nach und nach auch alle HTML-Forms auf UTF8 umgestellt, aber wer weiss, von wo sich ein "lateinisches" Ä - wie Ätsch einschleicht ...

        Kalle