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

MySQL 修改預設編碼為 UTF-8 徹底解決亂碼問題

     編輯:MySQL 資料庫相關知識

現狀檢查

mysql> SHOW VARIABLES LIKE 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

目標:所有 character_set_*(除 filesystem、system、dir)均為 utf8(或 utf8mb4)。

階段一:會話級暫時生效(重啟失效)

SET character_set_client = utf8;
SET character_set_connection = utf8;
SET character_set_database = utf8;
SET character_set_results = utf8;
SET character_set_server = utf8;

僅當前連線有效,不可用於生產固化。

階段二:配置檔固化(標準做法)

編輯 my.cnf(Linux)或 my.ini(Windows),在三個區塊**全部**加入:

[client]
default-character-set = utf8

[mysql]
default-character-set = utf8

[mysqld]
character-set-server = utf8
collation-server = utf8_general_ci
init_connect = 'SET NAMES utf8'
  • [client]:影響 mysql、mysqldump 等客戶端工具。
  • [mysql]:影響 mysql 互動式客戶端。
  • [mysqld]:服務端預設字元集與校對規則,init_connect 讓每個新連線自動執行 SET NAMES utf8(超級用戶除外)。

重啟 MySQL 後驗證:

mysql> SHOW VARIABLES LIKE 'character%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| character_set_client     | utf8  |
| character_set_connection | utf8  |
| character_set_database   | utf8  |
| character_set_filesystem | binary|
| character_set_results    | utf8  |
| character_set_server     | utf8  |  <-- 關鍵!
| character_set_system     | utf8  |
+--------------------------+-------+

階段三:Windows 安裝精靈二次配置(若 my.ini 不生效)

執行:

X:\Path\MySQL\MySQL Server 5.x\bin\MySQLInstanceConfig.exe

重新跑精靈,編碼頁面選 UTF-8,完成後自動更新 my.ini 並重啟服務,徹底解決 character_set_server 卡在 latin1 的頑疾。

建表與應用層配合

CREATE TABLE t (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;  -- 表級指定
  • 欄位 COLLATE 可不指定,預設 utf8_general_ci。
  • 頁面/檔案儲存為 UTF-8(無 BOM)。
  • HTTP 標頭:header('Content-Type: text/html; charset=utf-8');
  • PHP 連線前:mysqli_set_charset($link, 'utf8'); 或 PDO DSN 加 charset=utf8。
  • JDBC URL:jdbc:mysql://host:3306/db?characterEncoding=utf8

編碼對照表

JavaMySQL
UTF-8utf8 / utf8mb4
GBKgbk
GB2312gb2312
ISO-8859-1latin1

進階:升級 utf8mb4

utf8 僅支援 BMP(3 字節),Emoji、生僻字需 utf8mb4(4 字節)。MySQL 5.5.3+ 支援:

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

既有表轉換:ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

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