要转换二进制或非边数字符串列以使用特定字符集,请使用ALTER TABLE
.若要成功转换,必须满足以下条件之一:
假设一个表t
有一个二进制列命名col1
定义为VARBINARY (50)
.假设列中的信息是使用单个字符集编码的,那么可以将其转换为具有该字符集的非二进制列。例如,如果col1
包含表示字符中的二进制数据希腊
字符集,你可以转换它如下:
ALTER TABLE t MODIFY col1 VARCHAR(50) CHARACTER SET greek;
如果您的原始列有一种类型二进制(50)
,你可以将它转换为CHAR (50)
,但结果值被填充0 x00
最后的字节,这可能是不可取的。要删除这些字节,请使用修剪()
功能:
更新T Set Col1 = TRIM(从COL1尾随0x00);
假设表t
非二进制列命名col1
定义为Char(50)字符集拉丁文1
但是你想把它转换为使用UTF8.
这样您就可以存储来自多种语言的值。下面的语句实现了这一点:
ALTER TABLE TOMIFY COL1 CHAR(50)字符集UTF8;
如果列包含不在两个字符集中的字符,则转换可能会有损。
如果您有MySQL 4.1之前的旧表,其中非二进制列包含的值实际上是用与服务器默认字符集不同的字符集编码的,那么就会出现一种特殊情况。例如,应用程序可能已经存储SJIS.
列中的值,即使MySQL的默认字符集不同。可以将列转换为使用合适的字符集,但需要额外的步骤。假设服务器的默认字符集是latin1
和col1
被定义为CHAR (50)
但它的内容是SJIS.
值。第一步是将列转换为二进制数据类型,这将删除现有的字符集信息,而不执行任何字符转换:
更改表T修改Col1 Blob;
下一步是将列转换为具有适当字符集的非二进制数据类型:
ALTER TABLE t MODIFY col1 CHAR(50) CHARACTER SET sjis;
此过程要求该表未在诸如此类语句中进行修改插
或者更新
升级到MySQL 4.1或更高版本后。在这种情况下,MySQL将在列中存储新的值使用latin1
,而列将包含混合SJIS.
和latin1
值并且无法正确转换。
如果您在最初创建列时指定了属性,那么在更改表时也应该指定它们ALTER TABLE
.例如,如果您指定了非空
和一个明确的默认的
值,您还应该在ALTER TABLE
声明。否则,结果列定义不包括这些属性。
要转换表中的所有字符列,请使用alter table ...转换为字符集
声明可能有用。看Section 13.1.9, " ALTER TABLE Statement ".Charset.