Ankündigung

Einklappen
Keine Ankündigung bisher.

Problem mit utf8/latin1

Einklappen

Neue Werbung 2019

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

  • Problem mit utf8/latin1

    Ich sitze nun seit 2 Tagen dran und bekomme es nicht geordnet

    Also ich habe ein XML Dokument mit UTF-8 Daten. Dieses XML Dokument lade ich (per PHP) und schreibe die Daten in eine Datenbank (per PHP).

    Problem ist nun, dass ich die Daten nur in die Datenbank bekomme, wenn ich zuvor "SET NAMES latin1" als Query ausführe oder es direkt beim init-command in meiner Konfiguration eintrage. Wieso nur dann? Ich habe einen UNIQUE KEY auf eine Spalte in die ich einmal "Fayt" und einmal "Fâyt" eintragen möchte. Dummerweise ist "a" = "â", daher auch diese Integrity constraint violation.

    Jetzt ist für mich die Frage, was genau der Fehler ist. Ist die MySQL Datenbank nicht richtig konfiguriert, dass die kein UTF-8 kann, oder sind es evtl. die Daten aus der XML Datei? Die Daten aus der XML Datei, welche ich in die Datenbank schreiben will, habe ich in mb_detect_string() geschoben und bekam "UTF-8" bei Begriffen mit Umlauten.

    Hiermit funktionierts nicht (SET NAMES utf:

    Code:
    # SHOW VARIABLES LIKE "%char%";
    character_set_client=utf8
    character_set_connection=utf8
    character_set_database=utf8
    character_set_filesystem=binary
    character_set_results=utf8
    character_set_serve=utf8
    character_set_system=utf8
    character_sets_dir=/usr/share/mysql/charsets/
    
    # SELECT VARIABLES LIKE "%collation%";
    collation_connection=utf8_general_ci
    collation_database=utf8_unicode_ci
    collation_server=utf8_unicode_ci
    
    # SELECT @@collation_connection;
    @@collation_connection=utf8_general_ci
    Hiermit funktionierts (SET NAMES latin1):

    Code:
    # SHOW VARIABLES LIKE "%char%";
    character_set_client=latin1
    character_set_connection=latin1
    character_set_database=utf8
    character_set_filesystem=binary
    character_set_results=latin1
    character_set_server=utf8
    character_set_system=utf8
    character_sets_dir=/usr/share/mysql/charsets/
    
    # SHOW VARIABLES LIKE "%collation%";
    collation_connection=latin1_swedish_ci
    collation_database=utf8_unicode_ci
    collation_server=utf8_unicode_ci
    
    # SELECT @@collation_connection;
    @@collation_connection=latin1_swedish_ci
    Ich hoffe mir kann da jmd. von euch weiterhelfen, denn ich weiß da in diesem Wirrwarr echt nicht mehr weiter.

    P.S.: Sofern die Daten in der XML Datei wirklich UTF-8 sind, möchte ich kein utf8_encode() verwenden und es sollte mit SET NAMES utf8 funktionieren.

  • #2
    Hast noch Glück dass du mit MySQL hantierst, bekomm das mal mit ner Oracle gebacken ..

    Im Prinzip wie immer (Forensuche) ist folgendes zu sagen: Konsequent UTF-8 verwenden in:
    Datenbasis (dein XML)
    PHP-Dateien (Editor Zeichensatz für Dateien: UTF-8 ohne BOM)
    PHP header() senden
    HTML <meta> setzen
    "SET NAMES utf8" für MySQL setzen
    Datenbank-Felder müssen UTF-8 gesetzt sein.

    Wenn trotzdem bei dir Fehler auftreten ist mindestens einer dieser Bedingungen bei dir nicht erfüllt. Ein Mischmasch von Zeichensätzen in der Datenbank ist auch irgendwie Käse, mal latin1 mal utf-8, da ist ein Durcheinander eigentlich schon vorprogrammiert. Es gibt keinen vernünftigen Grund, zumindest ab neuen Projekten durchweg UTF-8 zu verwenden.


    Welche Kollations hast du denn für die Datenbank/Tabellen/Spalten angegeben, in die die XML-Daten fließen?
    Wie hast du die XML-Daten denn als UTF-8 erkannt? Grundsätzlich gilt mal wieder, dass man nichts vermuten sollte, sondern beweisen. Einfach mal im MSIE aufmachen, Zeichenkodierung setzen (wenn nicht schon richtg gesetzt) und schauen, ob die Sonderzeichen korrekt dargestellt sind (soferns keine Entities sind). Das reicht ja schon. Dass irgendwo im XML steht, dass es gerne UTF-8 wäre, reicht aber halt nicht.

    Kommentar


    • #3
      Zitat von Zergling
      Hast noch Glück dass du mit MySQL hantierst, bekomm das mal mit ner Oracle gebacken ..
      Ich hatte noch keine Anwendung, welche Oracle benötigte

      Zitat von Zergling
      Im Prinzip wie immer (Forensuche) ist folgendes zu sagen: Konsequent UTF-8 verwenden in:
      Datenbasis (dein XML)
      PHP-Dateien (Editor Zeichensatz für Dateien: UTF-8 ohne BOM)
      PHP header() senden
      HTML <meta> setzen
      "SET NAMES utf8" für MySQL setzen
      Datenbank-Felder müssen UTF-8 gesetzt sein.
      Seit ich einmal vor etwas mehr als einem Jahr eine komplette Seite von ISO auf UTF-8 umstellen musste, mache ich alles in UTF-8, zumal ich es bei mir in der Firma erst garnicht anders darf

      Daten in der XML Datei, sind hoffentlich UTF-8 (dazu nachher mehr)
      PHP-Dateien erstelle ich grundsetzlich in UTF-8. UTF-8 ist in meinem Eclipse der Default-Charset.
      Mein Apache hat als Default UTF-8, dennoch sende ich nochmal explizit UTF-8 im Header mit (Content-Type: text/plain; charset=utf.
      HTML <meta> habe ich nicht wirklich, da das eigentlich ein CLI Script ist, nur führe ich es aktuell über den Apache bzw. den Browser auf.
      In meiner my.ini habe ich "SET NAMES utf8" als init-command definiert.
      Bei den Datenbankfeldern stelle ich explizit nichts ein, ich nutze da implizit die Einstellung der Tabelle (DEFAULT CHARSET=UTF.

      Zitat von Zergling
      Wenn trotzdem bei dir Fehler auftreten ist mindestens einer dieser Bedingungen bei dir nicht erfüllt. Ein Mischmasch von Zeichensätzen in der Datenbank ist auch irgendwie Käse, mal latin1 mal utf-8, da ist ein Durcheinander eigentlich schon vorprogrammiert. Es gibt keinen vernünftigen Grund, zumindest ab neuen Projekten durchweg UTF-8 zu verwenden.
      Deinen letzten Satz finde ich zwar etwas merkwürdig (es gibt keinen vernünftigen Grund bei neuen Projekten UTF-8 zu verwenden!?). Ich gehe einfach mal davon aus, das ich es falsch verstehe oder du dich verschrieben hast.

      Ich gehe ganz davon aus, dass ich irgendwo in meiner XML Datei kein UTF-8 habe, denn ein "file -i *.xml" hat mir für die Datei als Zeichensatz "us-ascii" ausgegeben und das sollte eigentlich nicht sein, wenn mind. ein Umlaut drin vorkommt. Zumal "â" nicht das einzige Nicht-ASCII Zeichen in der Datei ist (Ê, ô, ...).

      Zitat von Zergling
      Welche Kollations hast du denn für die Datenbank/Tabellen/Spalten angegeben, in die die XML-Daten fließen?
      Wie hast du die XML-Daten denn als UTF-8 erkannt? Grundsätzlich gilt mal wieder, dass man nichts vermuten sollte, sondern beweisen. Einfach mal im MSIE aufmachen, Zeichenkodierung setzen (wenn nicht schon richtg gesetzt) und schauen, ob die Sonderzeichen korrekt dargestellt sind (soferns keine Entities sind). Das reicht ja schon. Dass irgendwo im XML steht, dass es gerne UTF-8 wäre, reicht aber halt nicht.
      Die Collations habe ich nun nicht im Kopf, müsste ich heute Abend mal kontrollieren.

      Wie ich darauf komme, dass die Daten UTF-8 sind? Okay, ehrlich gesagt ist diese Aussage von mir schon sehr gewagt gewesen, denn ich habe nicht das Dokument ansich geprüft, sondern nur die Daten, welche ich in die Datenbank schreiben will. Ich habe die Daten, welche ich explizit in die Datenbank schreiben will, wie z.B. "Fâyt" mit einem mb_detect_encoding() geprüft. Da bekam ich als Ergebnis "UTF-8".

      Die Idee mit dem Betrachten der XML Daten im Internet Explorer ist ne gute Idee und werde ich heute Abend direkt mal testen.

      Leider habe ich aktuell keinen Zugriff auf die Daten und muss bis heute Abend warten um dies alles zu überprüfen und zu testen, aber ich melde mich dann nochmal, sobald ich das alles gemacht habe.

      Kommentar


      • #4
        Zitat von freq.9
        Deinen letzten Satz finde ich zwar etwas merkwürdig. Ich gehe einfach mal davon aus, das [..] du dich verschrieben hast.
        So ist es.

        So auf Anhieb scheint das ja alles richtig zu sein bei dir. Wenn es nicht am XML lag, solltest du trotzdem nochmal alles Schritt für Schritt nachprüfen.

        Kommentar


        • #5
          Also ich habe nun nochmal geschaut. Mache ich ein "file -i *.xml" ist die XML Datei text/xml, jedoch bekomme ich da nicht den Zeichensatz ausgegeben, wie ich es behauptet habe. Ich habe die Datei daraufhin mal in meinem Proton Editor, welcher kein UTF-8 kann geöffnet und die Umlaute wurden alle falsch dargestellt. Somit sind die Daten schonmal nicht ISO. Dann dachte ich, dass mir mb_detect_encoding() auf den Inhalt der XML Datei weiterhelfen könnte, jedoch bekam ich dann ASCII ausgegeben.

          Ich kann mir aber auch nicht vorstellen, dass die Daten ISO o.ä. sind, da die XML Datei von einem großen Unternehmen kommt, was durch und durch mit Umlauten zutun hat. Da es ein internationales Unternehmen mit Nutzern im asiatischen Bereich kann das auch eigentlich nicht sein, dass die ISO Daten liefern.

          Gehen wir einfach mal davon aus, dass diese Datei UTF-8 ist, wie es laut <?xml ... ?> auch definiert wird.

          Da ich für die Verbindung zur Datenbank das Zend Framework verwende und bei diesem Framework sehr wahrscheinlich keine Datei ISO sein wird gehen wir dahingehend auch mal davon aus, dass die Dateien alle UTF-8 können.

          Ich habe all meine Dateien mit dem Linux Tool "file" geprüft und bekam überall "utf-8" bzw. "us-ascii" zurückgeliefert.

          Meine MySQL Konfiguration (my.ini) sieht wie folgt aus:

          Code:
          [mysqld]
          port=3306
          collation_server=utf8_unicode_ci
          character_set_server=utf8
          init-connect='SET NAMES utf8'
          default-storage-engine=INNODB
          log=C:\Server\mysql\query.log
          basedir=C:\Server\mysql
          pid_file=C:\Server\mysql\mysqld.pid
          Da ich nun so auf Anhieb nicht herausgefunden habe, wie ich die COLLATE Einstellung einer Tabelle und/oder deren Felder rausbekomme, habe ich die Tabellen alle nochmal neu erstellt mit:

          Code:
          CREATE TABLE ... ( ..) ENGINE=INNODB DEFAULT CHARSET=UTF8 COLLATE utf8_general_ci;
          Ich habe im Zend Framework Code etwas rumgefuscht und mir darin nochmal die Queries anzeigen lassen, aber alles ist okay.

          Wobei mir jetzt grad mal so der dumme Einfall kommt, dass doch schon in der DB allein "a" = "â" eine 1 zurückgibt. Von daher brauchen wir doch eigentlich nicht den Fehler in den Daten von meiner XML Datei, noch im Skript oder im Zend Framework suchen. Die Datenbank bzw. die Verbindung zur Datenbank ist doch scheinbar schon komplett falsch konfiguriert. Aber wonach muss ich da nun suchen?

          // Editiert: 14.11.2007 - 19:50
          Ich habe nun nochmal geschaut zwischen dem MySQL Query Browser, meinem PHP-Skript und dem mysql Konsolentool. Ich habe folgendes SQL Statement ausgeführt:

          Code:
          SELECT 'a' = 'â';
          Hier mal das Ergbnis bei den einzelnen Testkandidaten:

          MySQL Query Browser: 1 [@@collation_connection=utf8_general_ci]
          mysql-Konsolentool: 0 [@@collation_connection=latin1_swedish_ci]
          PHP-Anwendung: 1 [@@collation_connection=utf8_general_ci]

          Kommentar


          • #6
            Hallo,
            ich habe das gerade mal bei mir ausprobiert.

            a = à ist tatsächlich 1 bei utf8_general_ci, nicht jedoch bei utf8_bin

            Zur Info: ci steht für Case Insensitive (also Groß-Kleinschreibung ignorierend), während bin für Binary Compare steht. Hilft dir diese Info um das Handling zu verstehen?
            Wofür brauchst du den Zeichenweisen Vergleich, reichen dir die implementierten Sortierfunktionen nicht?

            Kommentar


            • #7
              Was genau muss ich auf utf8_bin umstellen?

              // Editiert: 14.11.2007 - 22:00
              Okay, ich habe COLLATE auf utf8_bin gestellt und nun habe ich die Daten ohne Probleme und in UTF-8 in die Datenbank bekommen

              Kommentar

              Lädt...
              X