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

解決 MySQL 控制台查詢中文亂碼:字符集設置原理、set names 機制與永久生效配置

     編輯:MySQL 綜合教學

現象復現

mysql> SELECT name FROM user WHERE id=1;
+----------+
| name     |
+----------+
| ??????   |  -- 亂碼
+----------+

根因:字符集不匹配三層模型

MySQL 涉及三個字符集層級:

  1. 服務器/庫/表/列字符集:數據存儲編碼 (`SHOW CREATE TABLE`)。
  2. 連接字符集:客戶端↔服務器通信編碼 (`character_set_client/connection/results`)。
  3. 客戶端顯示字符集:終端/IDE/程序解碼顯示編碼 (Windows CMD 默認 GBK,Linux 終端默認 UTF-8)。

**亂碼本質:** 三者任意兩層不一致即產生亂碼。

即時生效:set names

mysql> SET NAMES gbk;        -- 告訴服務器:我發送 GBK,請返回 GBK
Query OK, 0 rows affected

mysql> SELECT name FROM user WHERE id=1;
+--------+
| name   |
+--------+
| 張三   |  -- 正常顯示 (前提:終端也是 GBK)
+--------+

`SET NAMES gbk` 等同於:

SET character_set_client = gbk;
SET character_set_connection = gbk;
SET character_set_results = gbk;

永久生效:配置文件

Linux /etc/my.cnf

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4'  -- 非超級用戶連接自動執行

Windows my.ini

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-server = utf8mb4

重啟服務生效:`systemctl restart mysqld` / `net stop mysql && net start mysql`。

驗證當前字符集

mysql> SHOW VARIABLES LIKE 'character_set_%';
+--------------------------+---------+
| Variable_name            | Value   |
+--------------------------+---------+
| character_set_client     | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database   | utf8mb4 |
| character_set_results    | utf8mb4 |
| character_set_server     | utf8mb4 |
| character_set_system     | utf8    |
+--------------------------+---------+

應用層最佳實踐 (PHP/PDO/Java/JDBC/Python)

-- PHP PDO (推薦)
$dsn = "mysql:host=localhost;dbname=test;charset=utf8mb4";

-- Java JDBC 8.0+
url = "jdbc:mysql://localhost:3306/test?characterEncoding=utf8mb4&useSSL=false&serverTimezone=Asia/Shanghai";

-- Python PyMySQL
conn = pymysql.connect(host='localhost', user='root', password='', db='test', charset='utf8mb4')

避坑:utf8 vs utf8mb4

  • MySQL `utf8` = **utf8mb3** (最多 3 字節,**不支持 Emoji、生僻字**)。
  • MySQL `utf8mb4` = 真正 UTF-8 (最多 4 字節,**完整 Unicode**)。
  • **新系統無腦 utf8mb4**,舊系統遷移 `ALTER TABLE ... CONVERT TO CHARACTER SET utf8mb4`。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved