Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  Character Sets, Collations, Unicode  /  Column Character Set Conversion

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 的默认字符集不同。可以将列转换为使用正确的字符集,但需要额外的一步。假设服务器的默认字符集是 latin1col1 定义为 CHAR(50),但其内容是 sjis 值。第一步是将列转换为二进制数据类型,这将删除现有的字符集信息,而不执行任何字符转换:

ALTER TABLE t MODIFY col1 BLOB;

下一步是将列转换为具有正确字符集的非二进制数据类型:

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

该过程要求表格在升级到 MySQL 4.1 或更高版本后没有被修改过,例如使用 INSERTUPDATE 语句。在那种情况下,MySQL 将使用 latin1 存储新值在列中,并且列将包含 sjislatin1 值的混合,无法正确转换。

如果您在创建列时指定了属性,那么在使用 ALTER TABLE 修改表格时也应该指定它们。例如,如果您指定了 NOT NULL 和显式的 DEFAULT 值,那么您也应该在 ALTER TABLE 语句中提供它们。否则,结果列定义将不包括这些属性。

要将表中的所有字符列转换,可以使用 ALTER TABLE ... CONVERT TO CHARACTER SET charset 语句。请参阅 第 15.1.9 节,“ALTER TABLE 语句”