2016-06-01 10 views
0

Ich kam durch ein verwirrendes Problem des Geistes mit mysql Kodierung heute und würde die Ideen schätzen, wie man das weiter debuggt.Mysql-Unicode-Zeichen sind in Ordnung, aber keine Akzente

Ich musste eine alte Perl-Anwendung aktualisieren, mit mysql 5.6, die ursprünglich nur auf Englisch und zu dem ich einige Unicode-Unterstützung (für Khmer-Skript) hinzufügen musste.

Ich dachte, es wäre am besten, eine Test-Installation zu machen. Ein Dump der prod db, importiert in eine Test-db, änderte den Zeichensatz der Tabellen, die die Unterstützung von utf8 collect utf8_unicode_cli benötigten.

Alles funktioniert gut, so ging für die Produktion gelten. Lief die sql Migrationsskripte, um Zeichensätze zu ändern, den neuen Code zu implementieren und ... khmer Zeichen speichern/zeigen gut, aber ältere Zeichen werden als Fragezeichen mit schwarzem Quadrat angezeigt.

Was mir wirklich ein Rätsel ist, dass

  • Test und prod laufen auf den gleichen (Fenster) Feld gleichen MySQL-Server-Instanz

  • beide Test und prod Datenbanken haben die gleichen charsets et Sortierungs

  • für die Tabelle in Frage, Test und prod zeigen Tabelle Anweisungen erstellen sind identisch

  • der gleiche Code mit Test funktioniert gut, aber zu prod angeschlossen nicht

Ich dachte, vielleicht die Originaldaten wurden in dem Prozess verstümmelt so gelöscht, und es über den App-Schnittstelle wieder einsetzen. Arbeitet noch am Test, aber nicht an Prod.

Derselbe Code funktioniert auf Test, so Code ist wahrscheinlich nicht das Problem. Beide auf der gleichen Server-Instanz so wahrscheinlich nicht Server-Konfiguration Problem. Khmer-Skript funktioniert gut, wahrscheinlich nicht ein utf "Konfiguration" Problem. Neue Daten werden falsch behandelt, also wahrscheinlich kein Datenmigrations-/Konvertierungsproblem.

So 2 Fragen:

  • ist das Fragezeichen mit schwarzem Quadrat eines Zeichen der doppelten Codierung oder einfach falsch Codierung

  • wie kann ich die weiter debuggen? Anyway zu sehen "rohen" mysql gespeicherten Daten zum Beispiel, so dass ich vergleichen könnte?

Jede Eingabe sehr geschätzt.

Antwort

0

Beim Versuch, UTF-8/utf8mb4 zu verwenden, wenn Sie Black Diamonds mit Fragezeichen zu sehen, einem dieser Fälle besteht:

Fall 1 (Original-Bytes waren nicht utf8):

  • Die zu speichernden Bytes sind nicht als utf8 codiert. Repariere das.
  • Die Verbindung (oder SET NAMES) für die INSERTund die SELECT waren nicht utf8/utf8mb4. Repariere das.
  • Überprüfen Sie auch, ob die Spalte in der Datenbank CHARACTER SET utf8 (oder utf8mb4) ist.

Fall 2 (original Bytes waren utf8):

  • Die Verbindung (oder SET NAMES) für die SELECT war nicht utf8/utf8mb4. Repariere das.
  • Überprüfen Sie auch, ob die Spalte in der Datenbank CHARACTER SET utf8 (oder utf8mb4) ist.

Schwarze Diamanten treten nur, wenn der Browser auf <meta charset=UTF-8>


nicht relevant gesetzt, aber da Sie brachte es auf:

Beim Versuch, UTF-8/utf8mb4 zu verwenden, wenn Sie sehen Mojibake, überprüfen Sie Folgendes. Diese Diskussion gilt für Double Encoding, die nicht unbedingt sichtbar ist.

  • Die zu speichernden Bytes müssen utf8-codiert sein.
  • Die Verbindung, wenn INSERTing und SELECTing Text muss utf8 oder utf8mb4 angeben. Die Spalte muss CHARACTER SET utf8 (oder utf8mb4) lauten.
  • HTML sollte mit <meta charset=UTF-8> beginnen.