Ankündigung

Einklappen
Keine Ankündigung bisher.

Zeichensatz UTF-8 und PhpMyAdmin

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Zeichensatz UTF-8 und PhpMyAdmin

    Hallo,
    ich habe eine Website in HTML5 und UTF-8. Alles funktioniert soweit.

    Wenn ich mir die Daten in PhpMyAdmin ansehe, werden die Umlaute und Sonderzeichen in dieser bekannten kryptischen Form angezeigt (Weiße Mäuse = Weiße Mäuse). Auch beim Exportieren bleibt das so. Die Ausgabe ist aber so, wie sie sein soll. Also alles gut! Wenn ich in PhpMyAdmin ein Wort mit Umlaut direkt eingebe, erfolgt als Ausgabe nur ein "?".

    Ich musste nun auf einen neuen Server umziehen, dort ist es genau umgekehrt: Die kryptischen Zeichen werden auch so ausgegeben. Wenn ich die Umlaute direkt in PhpMyAdmin eingebe, funktioniert es.

    Liegt das am Server, der PHP-Version, der Datenbank? Ich konnte keine wesentlichen Unterschiede feststellen.
    Muss ich die Daten vor dem Aufspielen auf den neuen Server konvertieren? Wie? Ich kenne nur von ANSI zu UTF-8, hier ist es ja quasi UTF-8 zu UTF-8…

    Danke für die Hilfe

  • #2
    Zitat von oriolus Beitrag anzeigen
    Wenn ich mir die Daten in PhpMyAdmin ansehe, werden die Umlaute und Sonderzeichen in dieser bekannten kryptischen Form angezeigt (Weiße Mäuse = Weiße Mäuse). Auch beim Exportieren bleibt das so. Die Ausgabe ist aber so, wie sie sein soll. Also alles gut!
    Nein, es ist nicht alles gut. Du hast offenbar Datenmüll in der Datenbank und durch einen Fehler bei einer Ausgabe oder Good Will des Browsers wird es in deiner Anwendung zufällig richtig dargestellt.

    Zitat von oriolus Beitrag anzeigen
    Liegt das am Server, der PHP-Version, der Datenbank? Ich konnte keine wesentlichen Unterschiede feststellen.
    Weder noch. Es liegt an deinen Daten.

    Zitat von oriolus Beitrag anzeigen
    Muss ich die Daten vor dem Aufspielen auf den neuen Server konvertieren? Wie? Ich kenne nur von ANSI zu UTF-8, hier ist es ja quasi UTF-8 zu UTF-8…
    Welches "Aufspielen"? Hast du irgendwas gemacht, das du in deiner Beschreibung nicht erwähnt hast? Es gibt übrigens keine Kodierung ANSI. ANSI ist ein Normungsinstitut.

    Kommentar


    • #3
      An dieser Stelle sei noch auf die Artikel in der Wissenssammlung hingewiesen, die das Thema erörtern
      https://php-de.github.io/jumpto/utf-8/
      https://php-de.github.io/jumpto/mysql-and-utf8/

      Kommentar


      • #4
        Danke für die Antwort!

        Das klingt logisch, aber was ich nicht verstehe:

        Ich habe eine Website (HTML5, UTF-8 ohne BOM, mit notepad++ erstellt, W3C validiert) mit einem Formular drauf. Wenn ich über das Formular Daten in die DB (Kollation utf8_general_ci) schreibe, werden sie wie gesagt in dieser kryptischen Form abgespeichert. Die Ausgabe ist aber korrekt, daher war ich bis jetzt davon ausgegangen, dass das alles so seine Richtigkeit hat...
        Das ist übrigens auf zwei Servern so (z.B. 1und1), nur auf dem neuen halt nicht.

        Mit Aufspielen meinte ich: Ich habe die Daten vom alten Server exportiert (als sql-Datei via PhpMyAdmin) und sie auf dem gleichen Weg in die DB auf dem neuen Server importiert.

        Kommentar


        • #5
          Du hast dir die Artikel und die weitergehenden Links nicht richtig durchgelesen oder einfach nicht verstanden.
          DB muss als default charset utf8 haben.
          Kollation ist nebensächlich, da das nur die Sortierreihenfolge darstellt. Wenn du da die falsche nimmst, die nicht zu deinem Zeichensatz passt, machst du das nur noch schlimmer.
          Verbindung zur Datenbank muss auf utf8 gestellt werden.
          Ist jetzt aber nichts, was in den Artikeln nicht auch erklärt wurde.

          Kommentar


          • #6
            Zitat von oriolus Beitrag anzeigen
            Wenn ich über das Formular Daten in die DB (Kollation utf8_general_ci) schreibe, werden sie wie gesagt in dieser kryptischen Form abgespeichert. Die Ausgabe ist aber korrekt, daher war ich bis jetzt davon ausgegangen, dass das alles so seine Richtigkeit hat...
            Die Kollation ist dafür irrelevant. Was vor allem zählt ist die Zeichenkodierung der Datenbankverbindung und die Zeichenkodierung, die im HTTP-Header gesendet wird.

            Kommentar


            • #7
              Danke Euch beiden, langsam beginne ich den Unterschied zwischen Kollation/Zeichenkodierung zu verstehen...

              Aber dann trotzdem noch 'ne dumme Frage: was bedeutet "Zeichenkodierung der Datenbankverbindung"?

              Wenn die Formular-Seite korrekt in UTF-8 codiert und deklariert ist, müsste doch alles richtig übertragen werden? Wo liegt der Fehler zwischen dem Absenden und dem Schreiben in die DB?



              Kommentar


              • #8
                Zitat von oriolus Beitrag anzeigen
                Aber dann trotzdem noch 'ne dumme Frage: was bedeutet "Zeichenkodierung der Datenbankverbindung"?
                Die Datenbankverbindung hat eine Zeichenkodierung gesetzt, damit der Datenbankserver weiß, in welcher Kodierung er die Daten liefern und empfangen soll. Diese musst du natürlich auf UTF-8 setzen.

                PHP-Code:
                $db = new PDO("mysql:host=localhost;dbname=DB;charset=utf8"); 
                oder
                PHP-Code:
                $db = new mysqli("localhost""my_user""my_password""test");
                $db->set_charset("utf8"); 
                Zitat von oriolus Beitrag anzeigen
                Wenn die Formular-Seite korrekt in UTF-8 codiert und deklariert ist, müsste doch alles richtig übertragen werden?
                Ist sie das? Schon mal in den HTTP-Header geschaut, welche Kodierung da wirklich drin steht?

                Kommentar


                • #9
                  Okay, danke! Ich war davon ausgegangen, dass eine UTF-Seite mit entsprechenden Meta-Angaben ausreichend ist. Werde mich nochmal damit befassen.

                  Kommentar


                  • #10
                    ich bin's nochmal...

                    Ich habe jetzt in die connect-Datei, die auf jeder Website includiert wird, eine Zeile eingefügt

                    PHP-Code:
                    session_start();

                    $dbserver mysqli_connect('db123456789.db.1and1.com','dbo12345','password12345','db12345') OR DIE ("Error: connect mysql");

                    mysqli_set_charset($dbserver"utf8");

                    date_default_timezone_set('Europe/Berlin'); 
                    und so die Zeichenkodierung der Datenbankverbindung von latin auf utf8 geändert. Jetzt läuft auch mit der Ausgabe alles so, wie es zu erwarten war.

                    Ist das alles so korrekt??

                    Ein Kollege von mir, wo ich Zugriff auf seinen Server habe, hat das Ganze anscheinend so gelöst, dass er stattdessen einfach

                    PHP-Code:
                    header('Content-Type: text/html; charset=utf-8'); 
                    eingefügt hat. Geht das auch und wo ist dann der Unterschied?







                    Kommentar


                    • #11
                      Geht das auch und wo ist dann der Unterschied?
                      Das Eine ist die DB-Verbindung und das andere der HTTP Header. Wenn der Webserver nicht schon per se UTF-8 ausliefert, brauchst du beides.

                      Kommentar


                      • #12

                        Web Application with HTML and Steps.jpg
                        Originale Bildquelle ist MDN, (open source)..

                        Der Unterschied wird aus der Grafik ersichtlich.
                        Dein Kollege setzt bei Punkt 1 an, also das was als HTTP Response an den Client ausgegeben wird. Daher die Funktion mit dem header.
                        Du hingegen setzt bei Punkt 3 an, Die Verbindung von deiner Anwendung(Script in PHP) zur Datenbank.

                        Wenn du das so machen würdest wie dein Kollege bleibt dein Problem bestehen.
                        Alle 7 bezeichneten Punkte müssen in einheitlicher Kodierung vorliegen.

                        Kommentar


                        • #13
                          Super, danke!

                          Kommentar

                          Lädt...
                          X