首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

Ubuntu 15.04 MySQL 5.6.25 解決中文亂碼:配置文件雙端鎖定 utf8mb4 實戰

     編輯:MySQL 綜合教學

Ubuntu 15.04 MySQL 5.6.25 解決中文亂碼:配置文件雙端鎖定 utf8mb4 實戰

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 而非 utf8mb4Emoji (😀) 存儲報錯 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 缺字符集參數驅動程序可能回退 latin1jdbc: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 部署的標準基線。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved