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
. См. Раздел 13.1.8, «ALTER TABLE Statement».charset
ALTER TABLE операторы, которые вносят изменения в наборы символов или сортировки таблиц или столбцов, должны выполняться с использованием ALGORITHM=COPY. Более подробную информацию см. в Разделе 14.13.1, «Операции DDL в режиме онлайн».
© 2025 Oracle
Licensed under the GPLv2 License.