Spec-Zone.ru › MySQL 8.4

12.7 Преобразование кодировки символов столбцов

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

  • Если столбец имеет бинарный тип данных (BINARY, VARBINARY, BLOB), все значения, которые он содержит, должны быть закодированы с использованием одной кодировки символов (кодировки, в которую вы преобразуете столбец). Если вы используете бинарный столбец для хранения информации в нескольких кодировках символов, MySQL не может определить, какие значения используют какую кодировку и не может корректно преобразовать данные.

  • Если столбец имеет небинарный тип данных (CHAR, VARCHAR, TEXT), его содержимое должно быть закодировано в кодировке символов столбца, а не в какой-либо другой кодировке. Если содержимое закодировано в другой кодировке, вы можете сначала преобразовать столбец в бинарный тип данных, а затем в небинарный столбец с желаемой кодировкой символов.

Предположим, что таблица t имеет бинарный столбец под названием col1, определённый как VARBINARY(50). Предполагая, что информация в столбце закодирована с использованием одной кодировки символов, вы можете преобразовать её в небинарный столбец, который имеет эту кодировку. Например, если col1 содержит бинарные данные, представляющие символы в кодировке greek, вы можете преобразовать его следующим образом:

ALTER TABLE t MODIFY col1 VARCHAR(50) CHARACTER SET greek;

Если ваш исходный столбец имеет тип BINARY(50), вы можете преобразовать его в CHAR(50), но полученные значения будут дополнены 0x00 байтами в конце, что может быть нежелательно. Чтобы удалить эти байты, используйте функцию TRIM():

UPDATE t SET col1 = TRIM(TRAILING 0x00 FROM col1);

Предположим, что таблица t имеет небинарный столбец под названием col1, определённый как CHAR(50) CHARACTER SET latin1, но вы хотите преобразовать его для использования utf8mb4, чтобы вы могли хранить значения из многих языков. Следующее утверждение выполняет это:

ALTER TABLE t MODIFY col1 CHAR(50) CHARACTER SET utf8mb4;

Преобразование может быть потерей данных, если столбец содержит символы, которых нет в обеих кодировках.

Случай особый, если у вас есть старые таблицы до MySQL 4.1, где небинарный столбец содержит значения, которые фактически закодированы в кодировке символов, отличной от кодировки символов по умолчанию сервера. Например, приложение может хранить sjis значения в столбце, даже если кодировка символов по умолчанию MySQL была другой. Преобразование столбца для использования правильной кодировки символов возможно, но требуется дополнительный шаг. Предположим, что кодировка символов по умолчанию сервера была latin1 и col1 определена как CHAR(50), но его содержимое - sjis значения. Первый шаг - преобразовать столбец в бинарный тип данных, что удалит существующую информацию о кодировке символов без выполнения преобразования символов:

ALTER TABLE t MODIFY col1 BLOB;

Следующий шаг - преобразовать столбец в небинарный тип данных с правильной кодировкой символов:

ALTER TABLE t MODIFY col1 CHAR(50) CHARACTER SET sjis;

Эта процедура требует, чтобы таблица не была изменена уже такими операторами, как INSERT или UPDATE после обновления до MySQL 4.1 или более поздней версии. В этом случае MySQL будет хранить новые значения в столбце, используя latin1, и столбец будет содержать смесь sjis и latin1 значений и не может быть правильно преобразован.

Если вы указали атрибуты при первоначальном создании столбца, вы также должны указать их при изменении таблицы с помощью ALTER TABLE. Например, если вы указали NOT NULL и явное значение DEFAULT, вы также должны предоставить их в операторе ALTER TABLE. В противном случае, полученное определение столбца не включает эти атрибуты.

Для преобразования всех столбцов символов в таблице может быть полезен оператор ALTER TABLE ... CONVERT TO CHARACTER SET charset. См. Раздел 15.1.9, «Оператор ALTER TABLE».

Примечание

ALTER TABLE операторы, которые вносят изменения в кодировку символов или сортировки таблиц или столбцов, должны выполняться с помощью ALGORITHM=COPY. Более подробная информация приведена в Разделе 17.12.1, «Операции DDL в режиме онлайн».

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/charset-conversion.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API