Страшная ошибка кодирования импорта MySQL - пересмотренная

У меня есть стандартная ошибка кодирования импорта MySQL, но я не могу ее решить.

У моего клиента была установка WordPress на некоторое время. Я сбросил базу данных в файл и импортировал ее локально. Полученные страницы имеют разбрызгивание символов.

Я изучил свойства базы данных с обеих сторон: производство: показать создание базы данных wordpress;

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

local: show create wordpress wordpress,

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

production: 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

Я часами читал форумы о том, как раздавить, но я не могу заставить ничего работать. 99% ответов говорят, что они соответствуют набору символов между базами данных. То, что я думаю, должно работать, если следующее:

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

Я сделал это с помощью utf8 char -set. Все еще с.

Я попытался напрямую изменить дамп SQL, поставив с помощью utf8 или latin1 в строке "SET names UTF8". Все еще с.

Странные симптомы

Я ожидаю, что эти символы появятся вместо специальных символов в контенте, например ñ или ö, но я видел его там, где обычно было просто пространство. Я также видел это вместо апострофов (но не всех апострофов), двойных кавычек и символов товарных знаков.

Знаки are довольно редки. Они появляются в среднем от трех до четырех раз за страницу.

Я не вижу никаких при просмотре базы данных через Sequel Pro (локально или вживую). Я не вижу никаких в SQL при просмотре через Textmate.

Что мне не хватает?

ИЗМЕНИТЬ

Дополнительная информация:

Я попытался определить, что в базе данных думает, что кодировка. Я побежал show table status, и кажется, что Collations являются комбинацией utf8_general_ci, utf8_bin and latin1_swedish_ci`. Чем они отличаются? Это имеет значение?

Я также запускал: show variables like "character_set_database" и получил latin1;

Ответ 1

Вот как я решил решить мою проблему:

Сначала mysqldump -uusername -ppassword --default-character-set=latin1 database -r dump.sql

Затем запустите этот script:

$search = array('/latin1/');
$replace = array('utf8');
foreach (range(128, 255) as $dec) {
    $search[] = "/\x".dechex($dec)."/";
    $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);

script находит все шестнадцатеричные символы выше 127 и закодирует их в своих объектах HTML.

Тогда mysql -uusername -ppassword database < result.sql

Ответ 2

Общей проблемой со старыми базами данных WordPress и даже более новыми является то, что таблицы базы данных устанавливаются как latin-1, но содержимое фактически кодируется как UTF-8. Если вы попытаетесь экспортировать, поскольку UTF-8 MySQL попытается преобразовать (предположительно) данные Latin-1 в UTF-8, что приведет к двойным кодированным символам, поскольку данные уже были UTF-8.

Решение состоит в том, чтобы экспортировать таблицы как latin-1. Поскольку MySQL считает, что они уже латинские-1, он будет осуществлять прямой экспорт.

Измените набор символов с 'latin1' на 'utf8'. Так как сбрасываемые данные не были преобразованы во время процесса экспорта, его фактически кодированные данные UTF-8.

Создайте новую таблицу как UTF-8. Если ваша команда CREATE TABLE находится в вашем файле дампа SQL, измените набор символов с 'latin1' на 'utf8'.

Импорт данных обычно. Поскольку вы получили кодированные данные UTF-8 в вашем файле дампа, объявленный набор символов в файле дампа теперь является UTF-8, а таблица, в которую вы импортируете, - это UTF-8, все будет идти гладко

Ответ 3

Мне удалось решить эту проблему, изменив мой wp-config.php следующим образом:

/** 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' );

Ответ 4

Я думаю, вы можете решить эту проблему следующим образом:

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