文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
手冊頁 (TGZ) - 258.5Kb
手冊頁 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  字元集、排序、Unicode  /  資料行字元集轉換

12.7 資料行字元集轉換

若要將二進位或非二進位字串資料行轉換為使用特定的字元集,請使用 ALTER TABLE。若要成功進行轉換,必須符合下列其中一個條件

  • 如果資料行具有二進位資料類型 ( BINARYVARBINARYBLOB ),則其包含的所有值必須使用單一字元集 (您要將資料行轉換成的字元集) 進行編碼。如果您使用二進位資料行來儲存多個字元集的資訊,MySQL 無法知道哪些值使用哪個字元集,也無法正確轉換資料。

  • 如果資料行具有非二進位資料類型 ( CHARVARCHARTEXT ),則其內容應以資料行字元集 (而非其他字元集) 進行編碼。如果內容以不同的字元集編碼,您可以先將資料行轉換為使用二進位資料類型,然後再轉換為具有所需字元集的非二進位資料行。

假設資料表 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 或更高版本後,尚未透過諸如 INSERTUPDATE 之類的陳述式進行修改。在這種情況下,MySQL 會使用 latin1 將新值儲存在資料行中,而資料行會包含 sjislatin1 值的混合,且無法正確轉換。

如果您在最初建立資料行時指定了屬性,您也應該在使用 ALTER TABLE 修改資料表時指定它們。例如,如果您指定了 NOT NULL 和明確的 DEFAULT 值,您也應該在 ALTER TABLE 陳述式中提供它們。否則,產生的資料行定義不會包含這些屬性。

若要轉換資料表中所有字元資料行,ALTER TABLE ... CONVERT TO CHARACTER SET charset 陳述式可能會很有用。請參閱 第 15.1.9 節:「ALTER TABLE 陳述式」