首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

微信開發 MySQL 字元編碼亂碼終極解決:utf8mb4 完整配置指南

     編輯:MySQL 資料庫相關知識

微信開發中獲取用戶暱稱含 Emoji 表情導致 MySQL 存儲變 ??,根因是字元集不支援 4 字節字符。本文提供從配置檔、連線參數、資料庫/表/欄位層面的完整 utf8mb4 遷移方案。

一、問題根因分析

  • MySQL utf8 僅支援 3 字節字符 (BMP 平面),Emoji 屬於 4 字節補充平面
  • 插入 4 字節字符時被截斷或報錯 Incorrect string value
  • 讀取時顯示 ?? 或亂碼

二、完整配置修正 (MySQL 5.5.3+ 支援 utf8mb4)

1. 修改主配置檔 (/etc/mysql/my.cnf 或 /etc/my.cnf)

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4'
skip-character-set-client-handshake  # 強制忽略客戶端字元集設定

2. 重啟驗證

service mysql restart
# 或
systemctl restart mysqld

⚠️ 若啟動失敗檢查錯誤日誌,常見原因:舊版本不支援 utf8mb4_unicode_ci,改用 utf8mb4_general_ci。

3. 驗證配置生效

SHOW VARIABLES LIKE 'character_set_%';
SHOW VARIABLES LIKE 'collation_%';
STATUS;  -- 查看連線字元集

三、既有資料庫/表/欄位遷移

-- 資料庫層面
ALTER DATABASE db_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

-- 表層面 (含所有字串欄位)
ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 單欄位修改
ALTER TABLE tbl_name CHANGE col_name col_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

注意: utf8mb4 索引長度限制 767 bytes (InnoDB 預設),VARCHAR(191) 為安全長度 (191×4=764)。開啟 innodb_large_prefix=ON + innodb_file_format=Barracuda 可支援 3072 bytes。

四、應用層連線參數 (關鍵!)

語言/框架連線參數範例
JDBC (MySQL 5.1.38+)jdbc:mysql://host:3306/db?characterEncoding=utf8mb4&useUnicode=true
PHP PDOnew PDO("mysql:host=...;dbname=...;charset=utf8mb4", $user, $pass)
Python PyMySQLpymysql.connect(charset='utf8mb4')
Go sqlxdb, _ = sqlx.Open("mysql", "user:pass@tcp(host:3306)/db?charset=utf8mb4")

五、常見坑點排查

  1. 配置修改後未重啟 → 必須重啟 mysqld
  2. 應用層未指定 charset → 連線參數必須顯式設定 utf8mb4
  3. 資料庫/表未遷移 → 新建表預設用 server 字元集,舊表需 CONVERT
  4. 索引長度報錯 → 縮短 VARCHAR 長度或開啟 large_prefix
  5. 備份恢復亂碼 → mysqldump --default-character-set=utf8mb4 導出
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved