文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  字元集、校對、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 敘述」