Die Speicherung als serialisiertes Objekt in der MySql-Datenbank
Ich habe eine große php-Objekt, das ich serialisieren möchten und speichern in einer MySql-Datenbank. Die Tabelle Codierung ist UTF-8
und die Spalte zu halten, die serialisierte Objekt-Codierung ist auch UTF-8
.
Das problem ist das Objekt enthält einen text-string mit französischen Zeichen.
Beispiel:
Merci d'avoir passé commande avec Lovre. Voici le récapitulatif de votre commande
Wenn ich serialisieren Sie das Objekt dann unserialize wieder direkt der string ist gepflegt und ist im richtigen format.
Allerdings, wenn ich zum speichern der serialisierten Objekts in eine MySql-Datenbank dann wieder abrufen, dann unserialize Sie die Zeichenfolge, so wird:
Merci d'avoir passé commande avec Lovre. Voici le récapitulatif de votre commande
Etwas schief geht, wenn ich speichern das Objekt in der Datenbank.
Hinweise:
- Das Objekt gespeichert ist, propel ORM.
- Der Spalte Typ ist
text
. - Die Zeichenfolge gespeichert ist, und Lesen aus einer html-Datei.
- Was ist die Codierung der Datei?
- Sie könnten versuchen, base_64 verschlüsseln, aber man sollte das nicht machen. Welche Art ist die Spalte in der Datenbank? Haben Sie überprüft, die Datenbank-Verbindung festlegen in php?
- die Datenbank-Spalte des Typs text. Die Datenbank-Verbindung erfolgt über TREIBEN.
- Der string gespeichert ist, in eine html-Datei.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Des strings erstellt von
serialize
sind Binär-strings, die Sie nicht haben, einen bestimmten Zeichensatz aber nur ein "array" (array von bytes (wo-als ein byte ist 8 bit, ein Oktett).Wenn Ihr nun so ein string und Sag deiner Datenbank, es ist LATIN-1 kodiert und die Datenbank speichert es in ein text-Feld mit UTF-8-Kodierung der Datenbank wird transparent, ändern Sie die Codierung von LATIN-1 auf UTF-8. UTF-8 ist ein Zeichensatz, der verwendet mehr als ein byte pro Zeichen für Zeichen, wie zum Beispiel diejenigen, die Sie geben Ihre Frage wie
é
.Den Charakter
é
wird dann gespeichert alsé
innerhalb der Datenbank, die UTF-8-byte-Sequenz füré
.Wenn Sie jetzt Holen sich die Daten aus der Datenbank ohne Angabe, in welchem encoding du Sie brauchst, wird die Datenbank zurückgeben, da UTF-8.
Nun
unserialize
hat ein problem, da der Binär-string wurde modifiziert in einer Weise, die macht es ungültig.Stattdessen müssen Sie entweder sagen Sie Ihre Datenbank, es sollte nicht ändern Sie die Codierung, wenn es speichert die serialisierten string, z.B. durch die Wahl der richtigen Spalte Typ und die Kodierung (binäre Feld, BLOB - Binary Large ObjectMySQL-Docs, zu sehen, wie gut Binäre TypenTreiben Docs) -oder - wenn Sie das abrufen der Daten aus der Datenbank, die Sie wiederherstellen Sie die Zeichensatz-Kodierung zurück in das ursprüngliche format. Der erste Ansatz (binäres Feld) ist besser, weil es genau das ist, was du bist suchen für.
Für die Daten, die schon gespeichert in der Datenbank in einem falschen format, Sie benötigen die Daten zu korrigieren. Das zu tun, müssen Sie zunächst herausfinden, welche re-encoding angewendet wurde, z.B. aus welcher charset das charset. Ich nehme an, es ist LATIN-1, aber es ist keine Garantie. Sie müssen überprüfen Sie die Kodierung der aktuellen Anwendung Daten und Prozesse, um das herauszufinden.
Nachdem Sie herausgefunden haben, codieren Sie die Werte wieder von UTF-8 in der ursprünglichen Kodierung.
utf_decode
die Nachricht nach dem abrufen des Objekts von der Datenbank und das problem gelöst.Serializable
- interface in PHP, die hilfreich sein könnten, um zu halten Sie Ihren code sauber.stellen Sie sicher, dass utf-8 überall - klingt wie Sie etwas verpasst.
in deinem Fall denke ich, du hast vergessen, den korrekten Zeichensatz für Sie Datenbank-Verbindung (mit einem
SET NAMES
Anweisung oder mysql_set_charset()) - aber das ist schwer zu sagen, ohne zu sehen, Ihr code (und ich weiß nicht treiben).das folgende ist ein Zitat aus chazomaticus, wer hat die perfekte Antwort in UTF-8 den ganzen Weg durch mit einer Liste aller Punkte, die Sie haben zu kümmern:
beachten Sie, dass Sie nicht brauchen, um die Verwendung von utf-8 - der wichtige Teil ist, zu verwenden den gleichen Zeichensatz überall, unabhängig von welchem Zeichensatz das sein könnte. aber wenn Sie benötigen, Dinge zu ändern, jedenfalls utf-8 verwenden.
Ich bin immer speichern esrialized Daten über
base64_encode()
.Serialisiert die Daten manchmal Probleme verursacht, aber nach der Verwendung der base64-Wert, es sind nur einfache Zeichen bleiben.
Empfehle ich Sie verwenden die Funktionen json_encode statt serialisieren. Eines Tages finden Sie sich selbst versuchen, zu verwenden, die Daten von einem anderen Ort, der nicht PHP und Speicherung im JSON-macht es lesbar, überall, nahezu jede Sprache unterstützt die Dekodierung von JSON und ist ein gut stablished standard.
Die Antwort über die Verwendung von utf8 überall hält! 😀
serialize
nennen, Glauben Sie mir, ist eine noch viel schlechtere Idee, um zu speichern serialisiert Zeug.. wirst du irgendwann Lesen müssen, das Zeug von woanders. wenn Sie brauchen, um zu de-serialisieren zurück zu einer Klasse nur speichern als Typ string und wechseln Sie anschließend zu instanziieren, die richtige Klasse mit der json-Daten als Felder vs Rücksendung der einfachen json, wie jedes ORM hat im Grunde für die DB-Datensätze.