Как изменить кодировку таблицы без изменения данных? - PullRequest
2 голосов
/ 06 февраля 2011

У меня есть несколько таблиц, которые помечены как utf8 (возможно, из-за ошибок при импорте с другого сервера несколько лет назад), хотя их данные на самом деле греческие (однобайтовые). Можно ли как-нибудь изменить кодировку таблицы, не пытаясь MySQL конвертировать данные тоже?

Редактировать, чтобы избежать недопонимания: Данные НЕ UTF-8. Это просто помечено как таковое. Я хочу изменить кодировку таблицы, чтобы отразить фактическую кодировку данных, чтобы я мог приступить к ее фактическому преобразованию в utf8.

Спасибо.

Ответы [ 3 ]

3 голосов
/ 06 февраля 2011

Первое, о чем вам нужно подумать - зачем менять то, что работает? UTF-8 подходит для хранения греческого.

Неужели у вас так много свободного места на сервере базы данных, что такие радикальные изменения могут сэкономить так много?


Что касается изменения кодировки без преобразования данных - нет, это невозможно. Данные хранятся в формате UTF-8 и должны быть преобразованы в правильную кодировку, иначе вы получите нечитаемый набор столбцов.


Обновление:

Если данные уже в правильной кодировке, изменение кодировки без преобразования может привести к повреждению данных. Зачем? Поскольку UTF-8 не является однобайтовым набором символов, а тип столбца определяет, как ядро ​​базы данных хранит данные на диске и получает к ним доступ.

Я предлагаю поэкспериментировать - создайте столбец UTF-8 в тестовой таблице, заполните его существующими данными и выполните преобразование. Если смена типа столбца завершится успешно без преобразования, все готово.

1 голос
/ 08 февраля 2011

Очевидно, что решение состоит в том, чтобы экспортировать необработанные данные (SELECT * INTO OUTFILE ...), использовать iconv из командной строки для преобразования из utf8 в latin1, а затем импортировать обратно (LOAD DATA INFILE ... CHARACTER SET GREEK):)

0 голосов
/ 22 апреля 2017

Это очень старый пост, но все еще нет правильного ответа ...

Я задал этот вопрос, потому что мой подход к проблеме, которую я использовал ранее, несколько не работал.К счастью, я обнаружил, что моей проблемой был не мой подход, а инструмент - phpMyAdmin.Я сделал то же самое, используя консоль MySQL, и она отлично работает.

Решение

Если mysql считает, что данные находятся в одном наборе символов (то есть utf8)но фактические данные находятся в каком-то другом наборе символов (например, в латинице 1), тогда решение состоит в том, чтобы преобразовать столбец (столбцы) с текстом в тип неизвестного набора символов, например VARBINARY , BLOB / MEDIUMBLOB ... и затем преобразовать обратно в столбцы с информацией о наборе символов при настройке правильного набора символов.

В случае, если у вас есть MEDIUMTEXT тип столбца y в таблице x , содержащей данные в latin1 , в то время как mysql думает, что она находится в каком-то другом кодировке (в вашем случае utf8), используйте следующие инструкции по восстановлению:

mysql> ALTER TABLE `x` CHANGE `y` `y` MEDIUMBLOB;
mysql> ALTER TABLE `x` CHANGE `y` `y` MEDIUMTEXT CHARACTER SET latin1 COLLATE latin1_general_ci;

Вы, конечно, должны убедиться, что кодировка поддерживается вашим экземпляром MySQL.

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