萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL CONVERT() 函數:字符集轉換實戰指南

語法與核心用法

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
copyright © 萬盛學電腦網 all rights reserved