MySQL не будет поддерживать информацию о символах при импорте - PullRequest
0 голосов
/ 18 ноября 2008

Я пытаюсь импортировать большой файл SQL; создается mysqldump на одном сервере, а затем конвертируется с помощью iconv; используя эти команды:

$ mysqldump -uxxx -p xxx > data.sql
$ iconv -f UTF-8 -t ISO-8859-1//TRANSLIT data.sql data.iconv.sql

Я заметил, что "\ x91" в базе данных превратился в "\ xc3 \ x82 \ xc2 \ x91" в дампе, потому что mysqldump пытается преобразовать все в utf-8. Я преобразовал его обратно в "\ x91" с помощью iconv. Если я не преобразую их, они будут «\ xc2 \ x3f» на новом сервере; вместо того, чтобы просто \ x3f, как у нас сейчас.

Итак, как уже было сказано, есть некоторые символы, уникальные для кодировки cp1252, например "\ x91" и "\ x92". Оба эти символа превратились в "\ x3f" в новой базе данных; это команда, которую я использую для импорта:

$ /opt/mysql5/bin/mysql -uxxx -p -Dxxx < data.iconv.sql 

Кто-нибудь знает, как это могло произойти и что делать, чтобы предотвратить это? Зная это, я смогу перенести данные точно так, как это было.

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

Я использовал этот источник для iconv-вещей. Как вы можете видеть, на этой странице еще один человек имел проблемы с cp1252; может быть в этом причина.

Версия сервера:

old-host: Ver 10.10 Distrib 5.0.18, для pc-linux-gnu (i486) new-host: Ver 10.11 Distrib 5.0.51, для pc-linux-gnu (i686)

Ответы [ 6 ]

1 голос
/ 06 декабря 2008

В моей системе по умолчанию mysqld сохраняет данные в латинице 1 с шведской сортировкой. Точно так же клиент командной строки mysql по умолчанию предоставляет данные в latin1. mysqldump, по умолчанию, по умолчанию - utf-8.

Это вызывает проблемы при экспорте данных через mysqldump, а затем при импорте с использованием клиента командной строки mysql - символы, которые не являются общими для двух наборов символов, видоизменяются.

Решение состоит в том, чтобы получить mysqldump для декорирования данных с помощью дополнительных команд, которые будут правильно устанавливать набор символов клиентов mysql:

mysqldump --set-charset ...

По умолчанию это добавит "set name = utf-8" в выгруженные данные. Теперь он может быть полностью импортирован клиентом MySQL.

Дополнительная опция "--default-character-set=xxx" может использоваться с mysqldump для преобразования дампа во что-то отличное от utf-8.

Использование опции -set-charset должно полностью исключить использование iconv.

0 голосов
/ 20 ноября 2008

Какую версию mysqldump вы используете?

Последняя версия 5 выпускает дампы таблиц с командами, которые устанавливают набор символов, например:

SET @saved_cs_client     = @@character_set_client;
SET character_set_client = utf8;

CREATE TABLE ...
...
...
SET character_set_client = @saved_cs_client;

Может ли наличие / отсутствие этих факторов повлиять на ваш импорт?

0 голосов
/ 19 ноября 2008

Если MySQL конвертирует в UTF-8, то вы хотите:

iconv -f utf-8 -t IBM-1252 xxxx

Это должно преобразовать открытую цитату обратно в x "91". «Xc291» действительно является utf-8 для открытой цитаты.

0 голосов
/ 19 ноября 2008

Попробуйте: -

iconv -f IBM-1252 -t ISO-8859-1

Не уверен, почему мой предыдущий ответ был помечен. UTF-8 не является ASCII! Все 7-битные UTF-символы идентичны 7-битному набору символов ASCI, но первый бит b'1000000 'имеет особое значение в UTF-8 и указывает на то, что символ представляет собой Unicode, два, три или четыре байта символа.

0 голосов
/ 19 ноября 2008

Я до сих пор не нашел работающего решения; мы попробуем выполнить миграцию, используя скрипт, который устанавливает 2 соединения и просто выбирает одно соединение и обновляет другое ...

0 голосов
/ 18 ноября 2008

Если ваши данные cp1252, почему вы говорите iconv его utf-8?

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