語法與核心用法
CONVERT(expr USING transcoding_name)
-- transcoding_name 即字符集名稱:utf8mb4, gbk, latin1 等
典型應用場景
1. 字串字面值轉換
SELECT CONVERT(_latin1'Müller' USING utf8mb4);
-- _latin1 引入字面值編碼,轉為 utf8mb4 字串
2. 表資料遷移轉碼
-- 建立目標表 (utf8mb4)
CREATE TABLE utf8_tbl LIKE latin1_tbl;
ALTER TABLE utf8_tbl CONVERT TO CHARACTER SET utf8mb4;
-- 或 INSERT SELECT 轉換
INSERT INTO utf8_tbl (col)
SELECT CONVERT(latin1_col USING utf8mb4) FROM latin1_tbl;
3. 應用層編碼不一致修正
-- 連線為 utf8mb4,但資料實為 latin1 存儲
SELECT CONVERT(CONVERT(col USING latin1) USING utf8mb4) FROM t;
-- 雙重轉換:先按 latin1 解碼位元組,再編碼為 utf8mb4
標準 SQL 與 MySQL 差異
- 標準 SQL:
CONVERT(expr, target_type) 型別轉換 (如字串轉數字)
- MySQL 另提供
CAST(expr AS type) 做型別轉換
CONVERT(... USING ...) 專用於字符集轉換,符合 SQL 標準
傳統模式下的特殊行為
-- sql_mode 含 TRADITIONAL
SELECT CONVERT('0000-00-00' USING DATE); -- 返回 NULL 並產生警告
-- 非嚴格模式返回 '0000-00-00'
效能與注意事項
- 大量資料轉碼:分批
INSERT ... SELECT,避免長鎖表
ALTER TABLE ... CONVERT TO CHARACTER SET 會重建表,大表用 pt-online-schema-change
- 索引欄位轉碼後需重建索引
- 檢查轉換後資料完整性:
SELECT COUNT(*) FROM t WHERE CONVERT(col USING utf8mb4) IS NULL AND col IS NOT NULL
相關函數對比
| 函數 | 用途 | 範例 |
| CONVERT(str USING charset) | 字符集轉換 | CONVERT('中' USING utf8mb4) |
| CAST(expr AS type) | 型別轉換 | CAST('123' AS UNSIGNED) |
| CHARSET(str) | 返回字串字符集 | CHARSET('abc') → utf8mb4 |
| COLLATION(str) | 返回字串校對規則 | COLLATION('abc') → utf8mb4_general_ci |