若要將二進位或非二進位字串資料行轉換為使用特定的字元集,請使用 ALTER TABLE
。若要成功進行轉換,必須符合下列其中一個條件
假設資料表 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 的預設字元集不同。您可以將資料行轉換為使用正確的字元集,但需要額外的步驟。假設伺服器的預設字元集為 latin1
,而 col1
定義為 CHAR(50)
,但其內容為 sjis
值。第一個步驟是將資料行轉換為二進位資料類型,這會移除現有的字元集資訊,而不執行任何字元轉換
ALTER TABLE t MODIFY col1 BLOB;
下一步是將資料行轉換為具有正確字元集的非二進位資料類型
ALTER TABLE t MODIFY col1 CHAR(50) CHARACTER SET sjis;
此程序要求資料表在升級到 MySQL 4.1 或更高版本後,尚未透過諸如 INSERT
或 UPDATE
之類的陳述式進行修改。在這種情況下,MySQL 會使用 latin1
將新值儲存在資料行中,而資料行會包含 sjis
和 latin1
值的混合,且無法正確轉換。
如果您在最初建立資料行時指定了屬性,您也應該在使用 ALTER TABLE
修改資料表時指定它們。例如,如果您指定了 NOT NULL
和明確的 DEFAULT
值,您也應該在 ALTER TABLE
陳述式中提供它們。否則,產生的資料行定義不會包含這些屬性。
若要轉換資料表中所有字元資料行,ALTER TABLE ... CONVERT TO CHARACTER SET
陳述式可能會很有用。請參閱 第 15.1.9 節:「ALTER TABLE 陳述式」。charset