萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

徹底解決 MySQL 中文亂碼:從伺服器、資料表到連線層的完整配置指南

亂碼根因三要素

  1. 伺服器預設字元集:若仍為 latin1,存入中文即截斷/錯誤編碼。
  2. 資料表/欄位字元集與排序規則:CHARACTER SET 與 COLLATE 需一致。
  3. 客戶端連線字元集:應用程式(PHP、Java、Python 等)連線時未正確宣告編碼。

強烈建議全鏈路採用 utf8mb4(MySQL 5.5.3+)或 utf8,完整支援所有 Unicode 字符(含 Emoji)。

Linux 環境永久修正(以 Debian/Ubuntu 為例)

MySQL 5.5 之前

# /etc/mysql/my.cnf
[client]
default-character-set = utf8

[mysqld]
default-character-set = utf8

若啟動報錯,將 mysqld 區段改為 character_set_server = utf8。

MySQL 5.5 之後(含 5.6/5.7/8.0)

# /etc/mysql/my.cnf
[client]
default-character-set = utf8

[mysqld]
default-storage-engine = INNODB
character-set-server = utf8
collation-server = utf8_general_ci

修改後執行 service mysql restart,再以 SHOW VARIABLES LIKE 'character_set_%'; 驗證。

建庫建表最佳實務

-- 建庫指定字元集與排序規則
CREATE DATABASE `test` 
  CHARACTER SET 'utf8' 
  COLLATE 'utf8_general_ci';

-- 建表指定引擎與字元集
CREATE TABLE `database_user` (
  `ID` VARCHAR(40) NOT NULL DEFAULT '',
  `UserID` VARCHAR(40) NOT NULL DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

「建庫、建表、連線」三端統一編碼,亂碼問題 99% 可避免。

既有資料庫/資料表編碼檢查與修正

-- 檢視伺服器預設
SHOW VARIABLES LIKE '%char%';

-- 檢視資料庫編碼
SHOW CREATE DATABASE `test`;

-- 檢視資料表編碼
SHOW CREATE TABLE `yjdb`;

-- 修改資料庫預設編碼(僅影響後續新建表)
ALTER DATABASE `db_name` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

-- 修改資料表預設編碼(僅影響後續新增欄位)
ALTER TABLE `tb_name` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

-- 將現有資料轉碼(需謹慎,建議先備份)
ALTER TABLE `tb_name` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

資料匯入匯出編碼一致性

  • 匯出檔以 UTF-8 儲存 → 連線執行 SET NAMES utf8; → 匯入。
  • 匯出檔以 ANSI (GBK) 儲存 → 連線執行 SET NAMES gbk; → 匯入。
  • 嚴禁跨編碼匯入(UTF-8 檔用 GBK 匯入或反之),否則必亂碼。

Web 應用層面修正

  1. 頁面宣告 <meta charset="utf-8">(或 GBK)。
  2. 資料庫連線參數加入 ?useUnicode=true&characterEncoding=utf-8(JDBC)或對應驅動參數。
  3. 程式碼執行第一條 SQL 前發送 SET NAMES utf8(或 gbk)。
copyright © 萬盛學電腦網 all rights reserved