字符串列的字符集转换
要将二进制或非二进制字符串列转换为使用特定字符集,请使用ALTER TABLE
。为了成功进行转换,必须满足以下条件之一:
- 如果列有一个二进制数据类型(
BINARY
,VARBINARY
,BLOB
),它包含必须使用单字节字符集(字符集你转换列)编码的所有值。如果使用二进制列将信息存储在多个字符集中,则MySQL无法知道哪些值使用哪个字符集,并且无法正确转换数据。 - 如果列具有一个非二进制数据类型(
CHAR
,VARCHAR
,TEXT
),其内容应在列的字符集,而不是一些其他字符集编码。如果内容使用不同的字符集编码,则可以先将该列转换为使用二进制数据类型,然后再转换为具有所需字符集的非二进制列。
假设一个表t
有一个名为col1
定义为的二进制列VARBINARY(50)
。假设该列中的信息是使用单个字符集编码的,则可以将其转换为具有该字符集的非二进制列。例如,如果col1
包含表示字符集中greek
字符的二进制数据,则可以按以下方式转换它:
ALTER TABLE tMODIFY col1 VARCHAR(50)CHARACTER SET greek;
如果原始列的类型为BINARY(50)
,则可以将其转换为CHAR(50)
,但是结果值将0x00
在末尾填充字节,这可能是不希望的。要删除这些字节,请使用以下TRIM()
函数:
UPDATE tSET col1 = TRIM(TRAILING 0x00FROM col1);
假设该表t
具有一个名为define的非二进制列col1
,CHAR(50)CHARACTER SET latin1
但您希望将其转换为要使用的列,utf8
以便可以存储多种语言的值。以下语句可以完成此任务:
ALTER TABLE tMODIFY col1 CHAR(50)CHARACTER SET utf8;
如果该列包含两个字符集中都没有的字符,则转换可能是有损失的。
如果您有MySQL 4.1之前的旧表,则这是一种特殊情况。在该表中,非二进制列包含的值实际上是使用与服务器默认字符集不同的字符集编码的。例如,sjis
即使MySQL的默认字符集不同,应用程序也可能将值存储在列中。可以将列转换为使用正确的字符集,但需要执行附加步骤。假设服务器的默认字符集为latin1
,col1
并且定义为,CHAR(50)
但其内容为sjis
值。第一步是将列转换为二进制数据类型,这将删除现有字符集信息,而无需执行任何字符转换:
ALTER TABLE tMODIFY col1 BLOB;
下一步是使用适当的字符集将列转换为非二进制数据类型:
ALTER TABLE tMODIFY col1 CHAR(50)CHARACTER SET sjis;
这个过程需要该表不是已经被用的语句,如修改INSERT
或UPDATE
升级到MySQL 4.1或更高版本后。在这种情况下,MySQL将使用将该新值存储在该列中latin1
,并且该列将包含sjis
和latin1
值的混合,因此无法正确转换。
如果在最初创建列时指定了属性,则在更改表时也应指定属性ALTER TABLE
。例如,如果指定了NOT NULL
和显式DEFAULT
值,则还应在ALTER TABLE
语句中提供它们。否则,结果列定义将不包括那些属性。
要转换表中的所有字符列,该语句可能会很有用。请参见“ ALTER TABLE语句”。ALTER TABLE ... CONVERT TO CHARACTER SET charset