Ubuntu apt-get 安裝的 MySQL 預設字符集常為 latin1,導致中文存儲亂碼、Emoji 報錯。本文針對 Ubuntu 15.04 / MySQL 5.6.25 環境,詳述雙配置文件修改、服務重啟、驗證全流程,並說明為何必須用 utf8mb4 而非 utf8。
# Ubuntu 15.04
# MySQL 5.6.25 (apt-get install mysql-server)
# 配置文件分離佈局:
# /etc/mysql/conf.d/mysql.cnf → 客戶端配置
# /etc/mysql/mysql.conf.d/mysqld.cnf → 服務端配置
/etc/mysql/conf.d/mysql.cnf[mysql]
# 原文件可能僅有 [mysql] 區塊,無具體參數
no-auto-rehash
default-character-set = utf8mb4
說明: no-auto-rehash 加速客戶端啟動(禁用自動補全),default-character-set 強制客戶端連接握手使用 utf8mb4。
/etc/mysql/mysql.conf.d/mysqld.cnf[mysqld]
# 基礎連接參數
socket = /var/run/mysqld/mysqld.sock
port = 3306
# 核心字符集設置(注意:5.6 使用 character-set-server,而非舊版 character_set_server)
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
# 建議同步設置 innodb 參數
innodb_file_per_table = 1
innodb_buffer_pool_size = 256M # 根據實際內存調整
關鍵點: MySQL 5.6+ 參數名為 character-set-server(含連字符),舊文檔常寫作 character_set_server(下劃線),兩者在配置文件中以連字符版為準。
sudo /etc/init.d/mysql restart
# 或 systemd 系統
sudo systemctl restart mysql
mysql> SHOW VARIABLES LIKE '%char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
關鍵驗證點: character_set_client、connection、database、results、server 全部為 utf8mb4。character_set_system 固定為 utf8(系統標識符內部編碼),無需關注。
| 坑點 | 後果 | 解決 |
|---|---|---|
僅修改服務端 character-set-server | 客戶端連接仍用 latin1 握手,數據傳輸層亂碼 | 雙端同步修改:客戶端 default-character-set + 服務端 character-set-server |
使用 utf8 而非 utf8mb4 | Emoji (😀) 存儲報錯 Incorrect string value,生僻字 (𠮷) 截斷 | 全鏈路 utf8mb4:服務端、客戶端、連接參數、JDBC URL 全部 utf8mb4 |
參數寫成下劃線 character_set_server | 配置不生效,MySQL 5.6+ 僅識別連字符版 | 統一用 character-set-server、collation-server |
| 舊庫舊表未重建 | 修改配置只影響新建庫表,現有對象保持原字符集 | ALTER DATABASE db CHARSET=utf8mb4; ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4; 逐個遷移 |
| JDBC URL 缺字符集參數 | 驅動程序可能回退 latin1 | jdbc:mysql://host:3306/db?useUnicode=true&characterEncoding=utf8mb4&zeroDateTimeBehavior=convertToNull |
# 生成遷移腳本
SELECT CONCAT('ALTER TABLE `', TABLE_SCHEMA, '`.`', TABLE_NAME, '` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;')
FROM information_schema.TABLES
WHERE TABLE_SCHEMA IN ('your_db1', 'your_db2') AND TABLE_TYPE='BASE TABLE';
# 執行前備份!大表會鎖表重建,建議用 pt-online-schema-change 或 gh-ost 在線遷移
Ubuntu apt 安裝 MySQL 解決中文亂碼核心在於:識別雙配置文件結構 → 客戶端/服務端雙端鎖定 utf8mb4 → 參數名用連字符版 → 重啟驗證 8 個 character_set_* 變量 → 遷移存量庫表 → JDBC URL 同步設置。此配置可徹底支援中文、日文、韓文、Emoji、生僻字全字符集場景,是現代 MySQL 部署的標準基線。