Das gefürchtete Codierungsproblem beim MySQL-Import – erneut aufgegriffen

Lesezeit: 5 Minuten

Matts Benutzeravatar
Matt

Ich habe das standardmäßige MySQL-Importcodierungsproblem, aber ich kann es anscheinend nicht lösen.

Bei meinem Kunden läuft seit einiger Zeit eine WordPress-Installation. Ich habe die Datenbank in eine Datei gesichert und lokal importiert. Die resultierenden Seiten weisen durchgehend ein Spritzer von �-Zeichen auf.

Ich habe die Datenbankeigenschaften auf beiden Seiten überprüft: production: show create database wordpress;

CREATE DATABASE `wordpress` /*!40100 DEFAULT CHARACTER SET latin1 */

local: show Datenbank erstellen WordPress;

CREATE DATABASE `wordpress` /*!40100 DEFAULT CHARACTER SET latin1 */

Produktion: show create table wp_posts;

CREATE TABLE `wp_posts` (
  `ID` bigint(20) unsigned NOT NULL auto_increment,
  ...
  KEY `post_date_gmt` (`post_date_gmt`)
) ENGINE=MyISAM AUTO_INCREMENT=7932 DEFAULT CHARSET=utf8

local: show create table wp_posts;

CREATE TABLE `wp_posts` (
  `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  ...
  KEY `post_date_gmt` (`post_date_gmt`)
) ENGINE=MyISAM AUTO_INCREMENT=7918 DEFAULT CHARSET=utf8

Ich habe Stunden damit verbracht, Foren zu lesen, wie man das � quetscht, aber ich kann nichts zum Laufen bringen. 99 % der Antworten besagen, dass der Zeichensatz zwischen den Datenbanken übereinstimmt. Was meiner Meinung nach funktionieren sollte, wenn Folgendes gilt:

mysqldump --opt --compress --default-character-set=latin1 -uusername -ppassword wordpress | ssh [email protected] mysql --default-character-set=latin1 -uusername -ppassword wordpress

Ich habe es auch mit dem utf8-Zeichensatz gemacht. Immer noch mit den �.

Ich habe versucht, den SQL-Dump direkt zu ändern und mit zu setzen utf8 oder Latein1 in der Zeile “SET names UTF8”. Immer noch mit den �.

Seltsame Symptome

Ich würde erwarten, dass diese �-Zeichen anstelle von Sonderzeichen im Inhalt erscheinen, wie z n oder Ö, aber ich habe es gesehen, wo normalerweise nur ein Leerzeichen vorhanden wäre. Ich habe es auch anstelle von Apostrophen gesehen (aber nicht alle Apostrophe), doppelte Anführungszeichen und Markensymbole.

Die �-Markierungen sind ziemlich selten. Sie erscheinen durchschnittlich drei- bis viermal pro Seite.

Ich sehe keine �, wenn ich die Datenbank über Sequel Pro (lokal oder live) ansehe. Ich sehe keine � in der SQL, wenn ich sie über Textmate ansehe.

Was vermisse ich?

BEARBEITEN

Mehr Info:

Ich habe versucht festzustellen, was die Live-Datenbank für die Codierung hält. Ich rannte show table statusund es scheint, dass die Collations eine Mischung aus sind utf8_general_ci,utf8_binandlatin1_swedish_ci`. Was sind sie anders? Spielt es eine Rolle?

Ich lief auch: show variables like "character_set_database" und bekam latin1;

So habe ich mein Problem letztendlich gelöst:

Zuerst mysqldump -uusername -ppassword --default-character-set=latin1 database -r dump.sql

Führen Sie dann dieses Skript aus:

$search = array('/latin1/');
$replace = array('utf8');
foreach (range(128, 255) as $dec) {
    $search[] = "/\x".dechex($dec)."https://stackoverflow.com/";
    $replace[] = "&#$dec;";
}

$input = fopen('dump.sql', 'r');
$output = fopen('result.sql', 'w');

while (!feof($input)) {
    $line = fgets($input);
    $line = preg_replace($search, $replace, $line);
    fwrite($output, $line);
}

fclose($input);
fclose($output);

Das Skript findet alle Hex-Zeichen über 127 und codiert sie in ihre HTML-Entitäten.

Dann mysql -uusername -ppassword database < result.sql

  • Vielen Dank, das hat mein Problem gelöst! Ich arbeite seit zwei Tagen an diesem verdammten Ding. Ich habe versucht, eine Kopie einer Datenbank in Türkisch zu bekommen, die Sonderzeichen mit Akzent enthielt. Als ich es importiert habe, stürzte es immer wieder ab, wo die Sonderzeichen waren. Ich habe in den Zeichensatz latin1 exportiert, dieses Skript oben ausgeführt und es danach problemlos importiert. Ich glaube, ich habe tatsächlich auch den Zeichensatz latin1 importiert, aber es hat funktioniert! Nochmals vielen Dank Mann.

    – Joshua Soileau

    6. August 2013 um 19:14 Uhr

Ein häufiges Problem bei älteren WordPress-Datenbanken und sogar neueren ist, dass die Datenbanktabellen als Latin-1 festgelegt werden, der Inhalt jedoch tatsächlich als UTF-8 codiert wird. Wenn Sie versuchen, als UTF-8 zu exportieren, versucht MySQL, die (angeblichen) Latin-1-Daten in UTF-8 zu konvertieren, was zu doppelt codierten Zeichen führt, da die Daten bereits UTF-8 waren.

Die Lösung besteht darin, die Tabellen als latin-1 zu exportieren. Da MySQL denkt, dass sie bereits Latin-1 sind, wird es einen direkten Export durchführen.

Ändern Sie den Zeichensatz von „latin1“ auf „utf8“. Da die ausgegebenen Daten während des Exportvorgangs nicht konvertiert wurden, handelt es sich tatsächlich um UTF-8-codierte Daten.

Erstellen Sie Ihre neue Tabelle als UTF-8. Wenn sich Ihr CREATE TABLE-Befehl in Ihrer SQL-Dump-Datei befindet, ändern Sie den Zeichensatz von „latin1“ in „utf8“.

Importieren Sie Ihre Daten ganz normal. Da Sie UTF-8-codierte Daten in Ihrer Dump-Datei haben, der deklarierte Zeichensatz in der Dump-Datei jetzt UTF-8 ist und die Tabelle, in die Sie importieren, UTF-8 ist, wird alles reibungslos verlaufen

  • Das klingt genau nach dem, was passiert.

    – Matt

    12. Mai 2011 um 23:30 Uhr

  • Ich habe den von Ihnen beschriebenen Prozess ausprobiert. Der Export: mysqldump --default-character-set=latin1 -u username -ppassword wordpress > dump-20110512.sql. Der Import: mysql -uusername -ppassword wordpress < dump-20110512.utf8-1.sql. Jetzt werden alle Felder, die ein � enthielten, am ersten � abgeschnitten. Der Import schien fehlerfrei verlaufen zu sein. Wenn ich die SQL-Datei auschecke, scheint die INSERT-Anweisung, die ich als Referenz verwende, vollständig zu sein. Ich glaube, die schelmischen Charaktere sind immer noch da. Ich sehe den Text <92> wo Apostrophe sein sollten.

    – Matt

    12. Mai 2011 um 23:41 Uhr

  • Ich habe jede Instanz von geändert Latein1 zu utf8 in der SQL-Datei. Einschließlich einiger am Ende TABELLE ERSTELLEN Aussagen, wo es hatte: ENGINE=MyISAM AUTO_INCREMENT=635 STANDARDZEICHENSATZ=latin1;

    – Matt

    12. Mai 2011 um 23:42 Uhr


Ich konnte dieses Problem lösen, indem ich meine wp-config.php wie folgt änderte:

/** Database Charset to use in creating database tables. */
define('DB_CHARSET', 'utf8');

/** The Database Collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', 'utf8_general_ci' );

  • 3 Stunden damit verbracht, nach einer Lösung zu suchen. DB dumped und mehrmals ohne Erfolg wiederhergestellt. Diese 2 Konstanten haben meinen Tag gerettet!

    – Julio Vedovatto

    24. Mai 2017 um 19:38 Uhr


Ich denke, Sie können dieses Problem auf diese Weise beheben:

$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
$db = mysql_select_db('mysql_db', $link);
mysql_query('set names utf8', $link);

1394560cookie-checkDas gefürchtete Codierungsproblem beim MySQL-Import – erneut aufgegriffen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy