импортированный дамп базы данных из базы данных latin1 в базу данных utf8 - PullRequest
0 голосов
/ 01 марта 2010

Я использовал iconv для преобразования из latin1 в utf8 , когда я выполнял дамп mysql базы данных из mysql v4.0.21 и импортировал его на новый сервер mysql v5 .0.45

Это было latin1 на старом сервере, utf8 на новом сервере, поэтому я запустил это на дампе mysql: iconv −f latin1 −t UTF−8 quickwebcms_2010-03-01.sql

Он запустился успешно, затем я импортировал его на новый сервер.

Теперь он отображает вопросительные знаки (?) (пример: College?s) и Â (пример: CollegeÂ’s), когда выводит некоторые данные в моем приложении PHP.

Я экспортировал таблицу, в которой отображаются эти символы, и выполнил поиск и замену всего текста в textmate, затем импортировал его обратно в новую базу данных, и некоторые поля были выгружены как нулевые, так что поиск и замена могут испортить что-то в процессе. Я сохранил таблицу CSV как UTF8 без BOM, и просто UTF8, и он все еще делает то же самое.

Любая помощь в том, почему это может происходить, приветствуется.

Ответы [ 3 ]

1 голос
/ 01 марта 2010

IIRC, mysqldump производит вывод UTF-8 по умолчанию, независимо от кодировки базы данных. Этот пользовательский комментарий в руководстве mySQL , кажется, подтверждает это:

Я просто использую наборы символов по умолчанию - обычно латинский. Тем не менее, дамп, созданный mysqldump, возможно, на удивление, находится в utf8. Это выглядит нормально, но приводит к проблемам с параметром --skip-opt для mysqldump, который отключает --set-charset, но оставляет дамп в utf8.

Возможно, тот факт, что mysqldump использует utf8 по умолчанию, и важность параметра --set-charset должны быть более четко задокументированы (см. Документацию по атрибуту --default-character-set для текущего упоминания об использовании). из utf8)

Попробуйте пропустить шаг iconv, может сработать сразу.

1 голос
/ 01 марта 2010

Если содержимое ваших таблиц в порядке (и в UTF-8) и в вашем веб-приложении все еще есть «плохие» символы, убедитесь, что ваше соединение MySQL использует кодировку UTF-8 в вашем PHP-скрипте. Даже если ваши базы данных и таблицы находятся в UTF-8, MySQL по умолчанию использует соединения latin1 (по крайней мере, в моей конфигурации общего сервера). Поэтому вы должны указать MySQL отправлять контент в формате UTF-8. В противном случае он на лету преобразует его в латиницу1, производя «плохие» символы на веб-страницах UTF-8.

Используйте mysql_set_charset , если доступно, в противном случае вы можете установить его с помощью SQL-запроса (всегда используйте mysql_set_charset, если доступно):

if (function_exists('mysql_set_charset'))
    mysql_set_charset('utf8', $conn);
else
{
    if (mysql_query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'", $conn) === false)
    {
        //Error! Do something...
    }
}

Также убедитесь, что ваша разметка (X) HTML также использует UTF-8:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
0 голосов
/ 01 марта 2010

Возможно, вам лучше загрузить данные на новый сервер как latin1, а затем использовать соответствующие ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 DEFAULT COLLATION utf8_unicode_ci для каждой таблицы (или использовать какой-нибудь сценарий, чтобы сделать это для вас).

Или вы можете сначала преобразовать, а затем сбросить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...