Что произойдет с существующими данными, если я изменю параметры сортировки столбца в MySQL?


Я запускаю производственное приложение с сервером базы данных MySQL. Я забыл установить параметры сортировки столбца с latin на utf8_unicode, что приводит к появлению странных данных при сохранении в столбце с многоязычными данными.

Мой вопрос в том, что произойдет с моими существующими данными, если я сейчас изменю параметры сортировки на utf8_unicode? Уничтожит ли это или повредит существующие данные или данные останутся, но новые данные будут сохранены как utf8, как и должно быть?

Я изменюсь с помощью phpMyAdmin web клиент.

Author: Lunc, 2011-04-07

5 answers

Запуск быстрого теста в MySQL 5.1 со столбцом VARCHAR, установленным в latin1_bin Я вставил несколько нелатинских символов

INSERT INTO Test VALUES ('英國華僑');

Я выбираю их и получаю мусор (как и ожидалось).

SELECT text from Test;

Дает

text
????

Затем я изменил параметры сортировки столбца на utf8_unicode и повторно запустил SELECT, и он показывает тот же результат

text
????

Это то, чего я ожидал бы - он сохранит данные, и данные останутся мусором, потому что при вставке данных столбец потерял дополнительный символ информацию и просто вставил? для каждого нелатинского символа и нет способа для???? чтобы снова стать 英國華僑.

Ваши данные останутся на месте, но они не будут исправлены.

 4
Author: Lunc, 2011-04-07 07:50:17

Статья http://mysqldump.azundris.com/archives/60-Handling-character-sets.html подробно обсуждает это, а также показывает, что произойдет.

Пожалуйста, обратите внимание, что вы смешиваете НАБОР СИМВОЛОВ (фактически кодировку) с ПАРАМЕТРАМИ СОРТИРОВКИ.

Набор символов определяет физическое представление строки в байтах на диске. Вы можете сделать это видимым, используя функцию HEX(), например SELECT HEX(str) FROM t WHERE id = 1, чтобы увидеть, как MySQL хранит байты вашей строки. Какой MySQL доставка вам может быть разной, в зависимости от набора символов вашего соединения, определенного с помощью SET NAMES .....

Параметры сортировки - это порядок сортировки. Это зависит от набора символов. Например, ваши данные могут быть в наборе символов latin1, но они могут быть упорядочены в соответствии с одним из двух немецких порядков сортировки latin1_german1_ci или latin1_german2_ci. В зависимости от вашего выбора, умляуты, такие как ö, будут сортироваться либо как oe, либо как o.

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

При изменении параметров сортировки изменяется порядок сортировки данных, но не сами данные. Если столбец, который вы меняете не является частью индекса, ничего не нужно делать, кроме перезаписи файла frm, и достаточно последние версии MySQL не должны делать больше.

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

MySQL пытается сохранить данные, делая это: до тех пор, пока имеющиеся у вас данные могут быть представлены в целевом объекте набор символов, преобразование не будет с потерями. Предупреждения будут напечатаны, если происходит усечение данных, и данные, которые не могут быть представлены в целевом наборе символов, будут заменены на?

 6
Author: Isotopp, 2011-04-07 11:24:23

Действительные данные будут правильно преобразованы:

При изменении типа данных с помощью ИЗМЕНЯЯ или МОДИФИЦИРУЯ, MySQL пытается как можно лучше преобразовать существующие значения столбцов в новый тип. Предупреждение: Это преобразование может привести к изменению данных.

Http://dev.mysql.com/doc/refman/5.5/en/alter-table.html

... и более конкретно:

Чтобы преобразовать двоичный или недвоичный строковый столбец для использования определенного набор символов, используйте ALTER TABLE. Для успешного преобразования должно выполняться одно из следующих условий : [...] Если столбец имеет недвоичный тип данных (CHAR, VARCHAR, ТЕКСТ), его содержимое должно быть закодировано в наборе символов столбца, а не в каком -либо другом наборе символов. Если содержимое закодировано в другом наборе символов, вы можете преобразовать столбец сначала в двоичный тип данных, а затем в недвоичный столбец с нужным символом набор.

Http://dev.mysql.com/doc/refman/5.1/en/charset-conversion.html

Таким образом, ваша проблема заключается в недопустимых данных, например, данных, закодированных в другом наборе символов. Я попробовал совет, предложенный в документации, и это в основном испортило мои данные, но причина в том, что мои данные уже были потеряны: запуск SELECT column, HEX(column) FROM table показал, что многобайтовые символы были вставлены как 0x3F (т. Е. символ ? в латинице 1). Мой стек MySQL был достаточно умен, чтобы обнаружить этот ввод данные не были латинскими 1 и преобразовывали их во что-то "совместимое". И как только данные исчезнут, вы не сможете их вернуть.

Подведем итог:

  1. Используйте HEX(), чтобы узнать, сохранились ли у вас ваши данные.
  2. Сделайте свои тесты в копии своей таблицы.
 1
Author: Álvaro González, 2011-04-07 08:17:08

Мой вопрос в том, что произойдет с моими существующими данными, если я сейчас изменю параметры сортировки на utf8_unicode?

Ответ: Если вы измените значение на utf8_unicode_ci, с вашими существующими данными ничего не произойдет (которые уже повреждены и останутся поврежденными, пока вы их не измените).

Уничтожит ли это или повредит существующие данные или данные останутся, но новые данные будут сохранены в формате utf8, как и должно быть?

Ответ: После перехода на utf8_unicode_ci, существующие данные не будут уничтожены. Он останется таким же, как и раньше (что-то вроде????). Однако, если вы вставите новые данные, содержащие символы Юникода, они будут сохранены правильно.

Я изменюсь с помощью веб-клиента phpMyAdmin.

Ответ: Конечно, вы можете изменить параметры сортировки с помощью phpMyAdmin, перейдя в раздел Операции > Параметры таблицы

 0
Author: Blesson Jose, 2015-05-11 05:39:53

ОСТОРОЖНО! Некоторые проблемы решаются с помощью

ALTER TABLE ... CONVERT TO ...

Некоторые решаются с помощью 2-шагового процесса

ALTER TABLE ... MODIFY ... VARBINARY...
ALTER TABLE ... MODIFY ... VARCHAR...

Если вы сделаете что-то не так, у вас будет худший беспорядок!

  1. Сделайте SELECT HEX(col), col ..., чтобы увидеть, что у вас действительно есть.
  2. Изучите это, чтобы узнать, какой у вас случай: Проблемы с символами utf8; то, что я вижу, не то, что я сохранил
  3. Выполните правильное исправление, основываясь на этих случаях: http://mysql.rjweb.org/doc.php/charcoll#fixes_for_various_cases
 0
Author: Rick James, 2017-05-23 12:34:12