MySQL не поддерживает символьную информацию при импорте

Я пытаюсь импортировать большой файл 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-things. Как видите, на этой странице еще один человек имел проблемы с cp1252; может в этом причина.

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

старый хост: Ver 10.10 Distrib 5.0.18, для pc-linux-gnu (i486) новый хост: Ver 10.11 Distrib 5.0.51, для pc-linux-gnu (i686)

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
0
1 233
6

Ответы 6

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

Упомянул об этом в вопросе об оригиналах; Если я этого не сделаю, mysqldump сгенерирует \ xc2 \ x91 вместо \ x91. Думаю, я читал на той же странице, что и это решение, что mysqldump пытается все преобразовать в utf-8. В этом случае ошибочно

gx. 18.11.2008 15:26

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

Пытаться:-

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

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

это не форум. если у вас есть дополнительные мысли, отредактируйте свой первый ответ

user3850 06.12.2008 18:04

Если mysql конвертируется в utf-8, вам нужно:

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

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

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

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

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

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

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

Ответил на ваш вопрос в основном посте!

gx. 20.11.2008 19:10

В моей системе mysqld по умолчанию сохраняет данные на latin1 со шведской сортировкой. Точно так же клиент командной строки 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.

Другие вопросы по теме