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

MySQL 中文亂碼徹底解決:從參數臨時修改到配置檔永久生效

     編輯:MySQL 綜合教學

MySQL 中文亂碼徹底解決:從參數臨時修改到配置檔永久生效

中文亂碼源於「字符集不一致」。本文記錄從 SET NAMES 臨時失效、SET character_set_xxx 重啟失效,到修改 my.cnf 永久生效、建表指定 CHARSET 終極驗證的完整排查過程。

現象與失效嘗試

  • SET NAMES utf8;:僅影響當前 Session,斷線失效。
  • SHOW VARIABLES LIKE '%character%'; 發現 character_set_database 與 character_set_server 為 latin1。
  • SET character_set_database=utf8;:重啟後還原。

永久生效:修改配置檔

1. 停止服務

sudo /etc/init.d/mysql stop
# 或 systemctl stop mysql

2. 編輯 my.cnf

sudo vim /etc/mysql/my.cnf
在 [mysqld] 區塊新增(行尾嚴禁多餘空格):
[mysqld]
character_set_server=utf8
init_connect='SET NAMES utf8'

3. 啟動服務

sudo /etc/init.d/mysql start

4. 驗證全域變數

mysql> SHOW VARIABLES LIKE '%character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_server     | utf8                       |
| character_set_database   | utf8                       |
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_results    | utf8                       |
| ...                      | ...                        |
+--------------------------+----------------------------+

關鍵驗證:建表必須顯式指定 CHARSET

即使 Server 層已是 UTF-8,CREATE TABLE t (...) ENGINE=InnoDB; 預設仍可能繼承舊庫的 latin1。必須:

CREATE TABLE t (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

或修改庫預設:ALTER DATABASE db_name CHARACTER SET utf8;

進階:升級 utf8mb4 支援 Emoji

[mysqld]
character_set_server=utf8mb4
collation_server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
  • 庫/表/欄位全鏈路 ALTER ... CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
  • JDBC URL 加 characterEncoding=utf8mb4(Connector/J 5.1.13+)。

避坑總結

操作生效範圍持久性
SET NAMES utf8當前 Session斷線失效
SET GLOBAL character_set_xxx全域(新連線)重啟失效
my.cnf [mysqld] 區塊設定全域永久永久生效
CREATE TABLE ... DEFAULT CHARSET=utf8該表永久(除非 ALTER)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved