2015-04-16 1 views
1

Это довольно просто.Экспорт/Импорт MySQL в/из разных наборов символов

У меня есть работающие таблицы db с DEFAULT CHARSET = utf8; Значение сортировки равно utf8_general_ci.

Все работает нормально. Приложение, использующее эту базу данных, сохраняет что-либо от мандарина (китайца) до шведского, и все хорошо и хорошо.

Однако. У db есть следующие настройки.

Variable_name Value 
character_set_client utf8 
character_set_connection utf8 
character_set_database latin1 
character_set_filesystem binary 
character_set_results utf8 
character_set_server latin1 
character_set_system utf8 
character_sets_dir /usr/share/mysql/charsets/ 

Как вы можете видеть, по неизвестным причинам дб имеет character_set_database и character_set_server набор в latin1.

Это не создает проблемы для приложения, которое его запускает, поэтому мы в порядке, но всякий раз, когда мы экспортируем и импортируем, в db, где все переменные charachter_set_ * установлены на utf8 или utf8mb4 (что похоже, является новым нормальным), это заставляет нас делать дополнительный запрос SET NAMES для каждого сеанса с базой данных, то есть это дорого и раздражает.

Есть ли способ исправить это, не повреждая данные или нарушая работу приложения?

Каковы подходящие настройки для MySQL, когда дело доходит до настроек персонажа, учитывая, что вы хотите запустить на нем глобальное приложение, и где я устанавливаю его так, чтобы он сохранялся не только на сеансе, но и навсегда (я полагаю, my.cnf).

Спасибо.

EDIT

Добавление значений от начала export.sql-файла. экспортировать, используя следующую строку

mysqldump --opt --u root -pPassword dbName | gzip > database.sql.gz 

- сервер версии 5.6.21-журнал

/*!40101 SET @[email protected]@CHARACTER_SET_CLIENT */; 

/*!40101 SET @[email protected]@CHARACTER_SET_RESULTS */; 

/*!40101 SET @[email protected]@COLLATION_CONNECTION */; 

/*!40101 SET NAMES utf8 */; 

/*!40103 SET @[email protected]@TIME_ZONE */; 

/*!40103 SET TIME_ZONE='+00:00' */; 

/*!40014 SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; 

/*!40014 SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; 

/*!40101 SET @[email protected]@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; 

/*!40111 SET @[email protected]@SQL_NOTES, SQL_NOTES=0 */; 
-- 
-- Table structure for table `so_and_so_blabla` 
... 

EDIT 2

Добавление вывода из SELECT, Col, шестнадцатеричном (COL) из табл , Обратите внимание, что это отлично работает как в исходном db AND при экспорте, так и в том, что я в db, где я импортировал данные, использует SET NAMES latin1, прежде чем я выхожу запрос.

Europas Länder 4575726F706173204CC383C2A46E646572 

ответ

1

Только трое, что SET NAMES изменений следует беспокоиться.

У китайцев есть несколько символов, которые нуждаются в utf8mb4.

Имейте в виду, что кодировка в клиенте - это то, о чем говорит SET NAMES.Для китайского, я рекомендую

  • SET NAMES utf8mb4 (или эквивалент), и
  • CHARACTER SET utf8mb4 на любых колонках (или недобросовестный из определения таблицы), который будет содержать китайский и
  • < мета ... utf8> на веб-страницы - заметьте, а не utf8mb4.

Редактировать

Давайте посмотрим, какие шаги вы использовали для экспорта и импорта. Если задействован mysqldump, просмотрите файл, который он генерирует, чтобы увидеть, есть ли какие-либо команды SET.

Edit 2

Так как ваш ä выглядит C383 C2A4 в шестнадцатеричном, у вас есть "двойное кодирование". Это, вероятно, в результате

  • Имея байт в кодировке utf8 (гекс C3A4 для ä), чтобы вставить в таблицу, и
  • с использованием SET NAMES latin1 во INSERT (вероятно, по умолчанию) (плохо, потому что он не согласен с кодировкой), и
  • Декларирование столбец в таблице, чтобы быть CHARACTER SET utf8 (хорошо)

что случилось, что C3 и A4, будучи объявлен быть latin1, были преобразованы в C383 и C2A4 для хранения в столбце таблицы utf8.

При вытаскивании такого отступа, одно декодирование даст вам ä, а второе декодирование вернет желаемый ä.

Подробнее о «двойном кодировании», а также о том, что ему делать, содержится в my character set blog. Существует четыре подхода к фиксации данных в таблице. Пожалуйста, экспериментируйте с ними, чтобы узнать, что лучше для вас. И используйте HEX(col), чтобы проверить, что находится в таблице.

+0

Спасибо за ответ. Пытаться понять, что вы имеете в виду. В вашем ответе вы начинаете с «нет». На что вы отвечаете «нет»? Мой главный вопрос заключается в том, как переместить данные в базу данных, которая позволяет мне пропустить первоначальный запрос «set names» для «latin1», который я должен сделать сегодня, чтобы заставить работу работать правильно после экспорта/импорта. – Adergaard

+0

Извините за «нет»; Я удалил его. И попросил больше информации. –

+0

Добавлена ​​информация на вопрос. Посмотрите все под ** ИЗМЕНИТЬ ** Как вы можете видеть, он использует SET NAMES utf8, хотя сервер установлен на latin1 (хотя ВСЕ таблицы находятся в utf8). – Adergaard

Смежные вопросы