Изменение кодировки символов MySQL.Сохраняется ли целостность данных? - PullRequest
0 голосов
/ 24 октября 2018

Мне придется преобразовать кодировку базы данных из латиницы-1 в utf-8.

Я знаю, что преобразование базы данных выполняется с помощью команды

ALTER DATABASE db_name
    [[DEFAULT] CHARACTER SET charset_name]
    [[DEFAULT] COLLATE collation_name]

Источник и преобразование существующей таблицы выполняется с помощью команды

ALTER TABLE tbl_name
    [[DEFAULT] CHARACTER SET charset_name]
    [COLLATE collation_name]

Источник .

Однако база данных уже существуети там участвует конфиденциальная информация.У меня вопрос, будут ли изменены данные, которые у меня уже есть.Цель этого вопроса состоит в том, что я должен дать оценку, прежде чем я сделаю изменение.

1 Ответ

0 голосов
/ 24 октября 2018

Каждый (символьно-строковый тип) столбец имеет свой собственный набор символов и метаданные сопоставления.

Если, когда столбец 's тип данных был указан (т. е. когда он последний раз создавался или изменялся), набор символов / параметры сортировки явно не указывались, тогда для столбца будут использоваться набор символов и параметры сортировки по умолчанию для таблицы.

Если, когда таблица была указана, набор символов / параметры сортировки по умолчанию явно не заданы, тогда набор символов и параметры сортировки базы данных по умолчанию будут использоваться для таблицы по умолчанию.

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

Чтобы обновить существующие данные, сначала следует прочитать Изменение набора символов раздел справочной страницы на ALTER TABLE:

Изменение набора символов

Чтобы изменить набор символов таблицы по умолчанию и все столбцы символов (CHAR, VARCHAR, TEXT) для нового набора символов, используйте такой оператор:

ALTER TABLE <em>tbl_name</em> CONVERT TO CHARACTER SET <em>charset_name</em>;

Оператор также изменяет параметры сортировки всех столбцов символов.Если вы укажете предложение no COLLATE, чтобы указать, какое сопоставление использовать, оператор использует сопоставление по умолчанию для набора символов.Если это сопоставление не подходит для предполагаемого использования таблицы (например, если оно изменится с сопоставления с учетом регистра на сопоставление без учета регистра), укажите явно сопоставление.

Для столбца с даннымитип VARCHAR или один из типов TEXT, CONVERT TO CHARACTER SET изменяет тип данных по мере необходимости, чтобы новый столбец был достаточно длинным, чтобы хранить столько символов, сколькооригинальный столбец.Например, столбец TEXT имеет два байта длины, которые хранят длину байта значений в столбце, максимум до 65 535.Для столбца latin1 TEXT каждому символу требуется один байт, поэтому в столбце может храниться до 65 535 символов.Если столбец преобразован в utf8, каждому символу может потребоваться до трех байтов для максимально возможной длины 3 × 65 535 = 196 605 байтов.Эта длина не помещается в байтах длины столбца TEXT, поэтому MySQL преобразует тип данных в MEDIUMTEXT, который является наименьшим типом строки, для которого байты длины могут записыватьзначение 196 605.Аналогично, столбец VARCHAR может быть преобразован в MEDIUMTEXT.

Во избежание изменения типа данных только что описанного типа не используйте CONVERT TO CHARACTER SET,Вместо этого используйте MODIFY, чтобы изменить отдельные столбцы.Например:

ALTER TABLE t MODIFY latin1_text_col TEXT CHARACTER SET utf8;
ALTER TABLE t MODIFY latin1_varchar_col VARCHAR(<em>M</em>) CHARACTER SET utf8;

Если указать CONVERT TO CHARACTER SET binary, CHAR, VARCHAR и TEXTстолбцы преобразуются в соответствующие им типы двоичных строк (BINARY, VARBINARY, BLOB).Это означает, что столбцы больше не будут иметь атрибут набора символов, и последующая операция CONVERT TO не будет применяться к ним.

Если charset_name равно DEFAULT в операции CONVERT TO CHARACTER SET используется набор символов, названный системной переменной character_set_database.

Предупреждение

Операция CONVERT TOпреобразует значения столбцов между исходным и именованным наборами символов.Это не , что вам нужно, если у вас есть столбец в одном наборе символов (например, latin1), но в сохраненных значениях фактически используется какой-то другой несовместимый набор символов (например, utf8).В этом случае вы должны сделать следующее для каждого такого столбца:

ALTER TABLE t1 CHANGE c1 c1 BLOB;
ALTER TABLE t1 CHANGE c1 c1 TEXT CHARACTER SET utf8;

Причина, по которой это работает, заключается в том, что при преобразовании в столбцы BLOB не выполняется преобразование..

Чтобы изменить только набор символов по умолчанию для таблицы, используйте этот оператор:

ALTER TABLE <em>tbl_name</em> DEFAULT CHARACTER SET <em>charset_name</em>;

Слово DEFAULT необязательно.Набор символов по умолчанию - это набор символов, который используется, если не указан набор символов для столбцов, которые вы добавляете в таблицу позже (например, с помощью ALTER TABLE ... ADD column).

Когда foreign_key_checks включена системная переменная, которая является настройкой по умолчанию, преобразование набора символов не разрешено для таблиц, которые содержат столбец строки символов, используемый в ограничении внешнего ключа.Обходной путь должен отключить foreign_key_checks перед выполнением преобразования набора символов.Перед повторным включением foreign_key_checks необходимо выполнить преобразование для обеих таблиц, участвующих в ограничении внешнего ключа.Если вы снова включите foreign_key_checks после преобразования только одной из таблиц, операция ON DELETE CASCADE или ON UPDATE CASCADE может повредить данные в ссылочной таблице из-за неявного преобразования, которое происходит во время этих операций (Ошибка #45290, ошибка # 74816).

...