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

MySQL 查看與修改字元集編碼完整實戰指南

     編輯:MySQL 資料庫相關知識

MySQL 預設 latin1` 不支援中文,必須調整為 utf8 或 utf8mb4。本文涵蓋:查看當前編碼、Linux/Windows 修改預設編碼、JDBC 連接字串指定編碼、會話級 SET NAMES 臨時修改、資料庫/表/欄位級獨立指定編碼六大場景。

1. 查看當前編碼設定

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_client:客戶端發送 SQL 的編碼
  • character_set_connection:連接層轉換編碼
  • character_set_database:預設資料庫編碼
  • character_set_results:結果集返回編碼
  • character_set_server:服務端預設編碼

**只要上述 4 個 (client/connection/results/server) 一致,即不會亂碼。**

2. Linux 修改預設編碼 (永久生效)

  1. 停止服務:service mysql stop
  2. 編輯 /etc/my.cnf (或 /etc/mysql/my.cnf):
[client]
default-character-set=utf8

[mysqld]
default-character-set=utf8
character-set-server=utf8
init_connect='SET NAMES utf8'
collation-server=utf8_general_ci
  1. 重啟服務:service mysql start
  2. 驗證:再次執行 SHOW VARIABLES LIKE 'character%'; 應全為 utf8。

3. Windows 環境建議重裝時圖形化配置

使用 MySQL Server Instance Config Wizard 逐步勾選 UTF-8,避免手改 my.ini 遺漏區塊導致 1067 錯誤。

4. 不便重裝時:單獨指定資料庫/表/欄位編碼

-- 建庫指定
CREATE DATABASE db_name CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE DATABASE IF NOT EXISTS db_name DEFAULT CHARACTER SET utf8;

-- 建表指定
CREATE TABLE t (c VARCHAR(50)) CHARSET=utf8;

-- 修改既有表
ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 欄位級指定
ALTER TABLE t MODIFY c VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_bin;

5. JDBC 連接字串指定編碼 (應用層)

jdbc:mysql://localhost:3306/db_name?useUnicode=true&characterEncoding=utf-8
# 注意:參數間**不可有空格**,否則報錯

6. 會話級臨時修改 (SET NAMES)

SET NAMES utf8;  -- 等同於同時設定 client/connection/results 三個變數
SET NAMES gbk;   -- 針對舊系統相容

**限制**:僅對**當前連線**生效,斷線失效;不改變資料儲存編碼(寫入仍按表/庫定義編碼存儲)。

驗證 SET NAMES 效果

SHOW VARIABLES LIKE 'character%';
-- 執行 SET NAMES utf8 前後對比,client/connection/results 變為 utf8
-- database/server 維持原值

最佳實踐總結

  1. **新部署**:my.cnf 統一設定 utf8mb4,資料庫/表預設繼承。
  2. **遷移舊庫**:ALTER TABLE ... CONVERT TO CHARACTER SET utf8mb4 逐表轉換,配合應用層連接字串 characterEncoding=utf-8。
  3. **應用層**:連接池初始化執行 SET NAMES utf8mb4(或依賴驅動 characterEncoding 參數)。
  4. **避坑**:utf8 實為 utf8mb3,**不支援 Emoji**,生產環境**強制使用 utf8mb4**。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved