10 Stimmen

Lade UTF-8-codierten Dump in MySQL.

Ich habe gestern ein paar Stunden damit verbracht, mir über dieses Problem die Haare auszureißen:

Ich habe eine Datenbank auf einem MySQL 4.1.22 Server mit der Codierung "UTF-8 Unicode (utf8)" (wie von phpMyAdmin gemeldet). Die Tabellen in dieser Datenbank haben als Standardsprache latin2 festgelegt. Aber die Webanwendung (CMS Made Simple in PHP geschrieben), die sie verwendet, zeigt Seiten in utf8 an...

Wie gescheitert das auch sein mag, es funktioniert tatsächlich. Die Webanwendung zeigt die Zeichen korrekt an (meistens Tschechisch und Polnisch werden verwendet).

Ich führe aus: "mysqldump -u xxx -p -h yyy dbname > dump.sql". Dies gibt mir ein SQL-Skript, das:

  • in jedem Editor (wie Notepad+) bei Anzeige in UTF-8 perfekt aussieht - alle Zeichen werden korrekt angezeigt
  • alle Tabellen im Skript haben als Standardsprache latin2
  • es enthält die Zeile "/*!40101 SET NAMES latin2 */;" am Anfang (unter anderen Einstellungen)

Jetzt möchte ich diese Datenbank auf einen anderen Server exportieren, der mit MySQL 5.0.67 läuft, ebenfalls mit der Servercodierung "UTF-8 Unicode (utf8)". Ich habe die gesamte CMS Made Simple Installation kopiert, das dump.sql Skript kopiert und "mysql -h ddd -u zzz -p dbname < dump.sql" ausgeführt. Danach sind alle Zeichen auf den CMSMS-Webseiten durcheinander.

Ich habe versucht einzustellen:
SET character_set_client = utf8;
SET character_set_connection = latin2;

Und alle Kombinationen (nur zur Sicherheit, auch wenn es für mich keinen Sinn ergibt): latin2/utf8, latin2/latin2, utf8/utf8, usw. - hilft nicht. Alle Zeichen sind immer noch durcheinander, manchmal jedoch auf eine andere Weise :).

Ich habe auch versucht, alle lateinischen Einstellungen im Skript durch utf8 zu ersetzen (Namen und Standardsprachen für Tabellen). Nichts.

Gibt es hier MySQL-Experten, die in nur wenigen Worten (ich bin sicher, es ist schließlich einfach) erklären könnten, wie dieses ganze Codierungszeug wirklich funktioniert? Ich habe 9.1.4. Verbindungssprachen und -kollationen gelesen, aber dort nichts Hilfreiches gefunden.

Danke, Matt

32voto

kolrie Punkte 12202

Hast du versucht, die Option --default-character-set=name hinzuzufügen, so wie hier:

mysql --default-character-set=utf8 -h ddd -u zzz -p datenbankname < dump.sql

Ich hatte dieses Problem schon mal und es hat nach Verwendung dieser Option funktioniert.

Hoffe, es hilft!

0voto

Matt Punkte 5188

Ugh... ok, scheint, dass ich eine Lösung gefunden habe.

MySQL ist hier nicht der Übeltäter. Ich habe jetzt einfach einen Dump und ein Laden gemacht, ohne Änderungen am dump.sql-Skript - das bedeutet, ich habe "set names latin2" und Tabellenzeichensätze so gelassen, wie sie waren. Dann habe ich meine ursprüngliche CMSMS-Installation auf die neue Datenbank umgestellt und... es hat richtig funktioniert. Die Codierung in der Datenbank ist also tatsächlich in Ordnung, oder zumindest funktioniert sie gut mit der CMSMS-Installation, die ich bei meinem alten Hosting-Anbieter hatte (CMSMS macht anscheinend lustige Dinge mit der Zeichencodierung).

Um es auf meinem neuen Hosting-Anbieter zum Laufen zu bringen, musste ich tatsächlich diese Zeile zu lib/adodb/drivers/adodb-mysql.inc.php in der CMSMS-Installation hinzufügen:

mysql\_query('set names latin2',$this->\_connectionID);

Dies ist eine leicht modifizierte Lösung aus diesem Beitrag. Die genaue Zeile finden Sie dort auch. Es scheint also ein Problem mit der mysql-Clientkonfiguration zu sein.

0voto

T.Todua Punkte 48569

LÖSUNG für mich:

Legen Sie diese Option in Ihrer php-Datei fest, nachdem mysql_connect (oder nach mysql_select_db) aufgerufen wurde.

mysql_query("SET NAMES 'utf8'");

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X