Страшная ошибка кодирования импорта 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);