Страшная проблема с кодировкой импорта MySQL - вновь - PullRequest
10 голосов
/ 13 мая 2011

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

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

Я проверил свойства базы данных с обеих сторон: production: show create database wordpress;

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

local: show create database 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 username@anotherserver.net mysql --default-character-set=latin1 -uusername -ppassword wordpress

Я сделал это, используя набор символов utf8.Все еще с with.

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

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

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

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

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

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

РЕДАКТИРОВАТЬ

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

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

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

Ответы [ 4 ]

11 голосов
/ 06 января 2012

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

Первый mysqldump -uusername -ppassword --default-character-set=latin1 database -r dump.sql

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

$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);

Скрипт находит все шестнадцатеричные символы выше 127 и кодирует их в свои HTML-сущности.

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

5 голосов
/ 13 мая 2011

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

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

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

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

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

4 голосов
/ 30 июня 2014

Мне удалось решить эту проблему, изменив мой 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' );
0 голосов
/ 13 мая 2011

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

$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
$db = mysql_select_db('mysql_db', $link);
mysql_query('set names utf8', $link);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...