Spec-Zone.ru › MySQL 5.7

10.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, но вы хотите преобразовать его для использования utf8, чтобы вы могли хранить значения из многих языков. Следующее утверждение выполнит это:

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

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

Особый случай возникает, если у вас есть старые таблицы, созданные до 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. См. Раздел 13.1.8, «ALTER TABLE Statement».

Примечание

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

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

Spec-Zone.ru

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