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

MySQL 字符集編碼完整配置指南:從亂碼到 UTF-8 最佳實踐

     編輯:MySQL 綜合教學

MySQL 字符集編碼完整配置指南:從亂碼到 UTF-8 最佳實踐

字符集問題是 MySQL 遷移、開發中最常見的坑。本文系統梳理從服務端、客戶端、庫表層面的完整配置鏈路,助你徹底告別亂碼。

核心概念:字符集與校對規則

  • 字符集: 字符到二進制的映射集合(如 utf8, utf8mb4, latin1, gbk)。
  • 校對規則: 字符比較/排序規則(如 utf8_general_ci 不區分大小寫,utf8_bin 二進制比較)。
  • 關鍵系統變量:
    character_set_client      -- 客戶端發送數據編碼
    character_set_connection  -- 服務端處理數據編碼
    character_set_results     -- 服務端返回結果編碼
    character_set_server      -- 服務端默認編碼
    character_set_database    -- 當前庫默認編碼
    collation_connection      -- 連接校對規則

一、 臨時會話級修正(快速止血)

連接建立後立即執行:

SET NAMES 'utf8mb4';

等價於:

SET character_set_client = utf8mb4;
SET character_set_results = utf8mb4;
SET character_set_connection = utf8mb4;

注意: 僅對當前連接生效,斷開失效。utf8mb4 支持 4 字節字符(Emoji、生僻字),強烈建議替代 utf8(僅 3 字節)。

二、 庫表層面顯式指定(持久化)

-- 創建庫
CREATE DATABASE `mydb` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

-- 創建表
CREATE TABLE `t_user` (
  `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(50) CHARACTER SET utf8mb4 NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

-- 修改現有庫表(需重建表/轉換數據,大表慎用)
ALTER DATABASE `mydb` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `t_user` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

三、 服務端配置文件全局生效(根治)

編輯 /etc/my.cnf(Linux)或 my.ini(Windows),在對應段落添加:

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
init_connect = 'SET NAMES utf8mb4'  -- 非超級用戶連接自動執行
skip-character-set-client-handshake -- 忽略客戶端聲明編碼,強制使用服務端設置

重啟 MySQL 服務生效。

四、 驗證配置結果

mysql> SHOW VARIABLES LIKE 'character_set_%';
mysql> SHOW VARIABLES LIKE 'collation_%';

期望輸出:client, connection, database, results, server 均為 utf8mb4。

五、 應用層連接字符串配置(關鍵一環)

JDBC 8.0+:

jdbc:mysql://host:3306/db?characterEncoding=utf8mb4&useUnicode=true&serverTimezone=Asia/Shanghai

Python (PyMySQL/Connector):

conn = pymysql.connect(host='...', charset='utf8mb4')

Go (go-sql-driver/mysql):

dsn := "user:pass@tcp(host:3306)/db?charset=utf8mb4&parseTime=True&loc=Local"

六、 常見避坑指南

  1. mysqldump 導出導入: 導出文件需為 UTF-8 編碼;導入前執行 SET NAMES utf8mb4;。
  2. 歷史 latin1 數據修復: 若表定義為 latin1 但實存 UTF-8 數據(雙重編碼),需先 ALTER TABLE ... CONVERT TO CHARACTER SET binary; 再 CONVERT TO CHARACTER SET utf8mb4;。
  3. 系統變量 character_set_system: 固定為 utf8,不可修改,僅用於標識符(表名、列名)存儲,不影響業務數據。

總結

字符集鏈路長、環節多,**「服務端配置文件全局指定 utf8mb4 + 應用層連接字符串顯式聲明 charset + 庫表創建時顯式指定」**是生產環境的黃金標準。統一編碼,拒絕隱式轉換,方能一勞永逸。

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