Команды, которые вы цитируете в своем вопросепросто измените такие наборы символов / параметры сортировки по умолчанию для базы данных и таблицы соответственно.Другими словами, они влияют только на таблицы и столбцы, которые создаются после этого - они не влияют на существующие столбцы (или данные).
Изменение набора символов
Чтобы изменить набор символов таблицы по умолчанию и все столбцы символов (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).