Mysql
 sql >> Datenbank >  >> RDS >> Mysql

utf8 verwenden oder nicht - MySQL- und PHP-Zeichencodierungsproblem

Ihr Problem ist, dass Ihr SET NAMES 'utf8_persian_ci' Befehl war ungültig (utf8_persion_ci ist eine Kollation , keine Codierung ). Wenn Sie es in einem Terminal ausführen, sehen Sie einen Fehler Unknown character set: 'utf8_persian_ci' . So wird Ihre Bewerbung, wenn sie gespeichert wird die Daten, wurde latin1 verwendet Zeichensatz. MySQL interpretierte Ihre Eingabe als latin1-Zeichen, die es dann als utf-8 codiert speicherte. Als die Daten wieder herausgezogen wurden, konvertierte MySQL sie ebenfalls von UTF-8 zurück in latin1 und (hoffentlich meistens) die ursprünglichen Bytes, die Sie ihnen gegeben haben.

Mit anderen Worten, alle Ihre Daten in der Datenbank sind völlig durcheinander, aber es hat einfach so funktioniert.

Um dies zu beheben, müssen Sie Ihre Aktion rückgängig machen. Der einfachste Weg ist die Verwendung von PHP:

  1. SET NAMES latin1;
  2. Wählen Sie jedes einzelne Textfeld aus jeder Tabelle aus.
  3. SET NAMES utf8;
  4. Aktualisieren Sie dieselben Zeilen mit derselben unveränderten Zeichenfolge.

Alternativ können Sie diese Schritte in MySQL ausführen, aber es ist schwierig, weil MySQL versteht, dass die Daten in einem bestimmten Zeichensatz vorliegen. Sie müssen Ihre Textspalten in einen BLOB-Typ ändern und sie dann zurück ändern auf Texttypen mit utf8-Zeichensatz. Siehe den Abschnitt am Ende von ALTER TABLE MySQL-Dokumentation mit der roten "Warnung" .

Nachdem Sie eines dieser Dinge getan haben, sind die in Ihren Datenbankspalten gespeicherten Bytes der tatsächliche Zeichensatz, für den sie sich ausgeben. Stellen Sie dann sicher, dass Sie immer mysql_set_charset('utf8') auf jeden Datenbankzugriff von PHP, den Sie in Zukunft tun könnten! Sonst bringt man wieder was durcheinander. (Beachten Sie, verwenden Sie kein einfaches mysql_query('SET NAMES utf8') ! Es gibt Eckfälle (z. B. eine zurückgesetzte Verbindung), in denen dies auf latin1 zurückgesetzt werden kann ohne Ihr Wissen. mysql_set_charset() setzt den Zeichensatz wann immer nötig.)

Am besten wechseln Sie von mysql_* weg Funktionen und verwendetem PDO stattdessen mit dem charset=utf8 Parameter in Ihrem PDO dsn .