Windows 下 MySQL 預設字符集 latin1 不支援中文,導致命令行顯示亂碼。修改 my.ini 統一設定為 gbk 或 utf8mb4 即可解決。
mysql> SELECT '中文測試';
+--------------+
| 中文測試 |
+--------------+
| ???? | -- 或 乱码字符
+--------------+
# 方式一:服務管理器
services.msc → MySQL → 右鍵停止
# 方式二:命令行 (管理員權限)
net stop mysql
# 常見路徑
C:\ProgramData\MySQL\MySQL Server 8.0\my.ini
C:\Program Files\MySQL\MySQL Server 8.0\my.ini
# 或安裝目錄下
[client]
default-character-set = gbk # 或 utf8mb4
[mysql]
default-character-set = gbk # 或 utf8mb4
[mysqld]
character-set-server = gbk # 或 utf8mb4
collation-server = gbk_chinese_ci # gbk 對應排序規則
# utf8mb4 對應:
# character-set-server = utf8mb4
# collation-server = utf8mb4_unicode_ci
# 可選:強制忽略客戶端字符集設置
# skip-character-set-client-handshake
net start mysql
mysql> SHOW VARIABLES LIKE 'character_set%';
+--------------------------+--------+
| Variable_name | Value |
+--------------------------+--------+
| character_set_client | gbk |
| character_set_connection | gbk |
| character_set_database | gbk |
| character_set_results | gbk |
| character_set_server | gbk |
| character_set_system | utf8 |
| character_sets_dir | ... |
+--------------------------+--------+
mysql> SELECT '中文測試';
+--------------+
| 中文測試 |
+--------------+
| 中文測試 | -- 正常顯示
+--------------+
| 維度 | gbk | utf8mb4 |
|---|---|---|
| 中文支援 | 完美 (國家標準) | 完美 (含 Emoji、生僻字) |
| 英文/其他語言 | 差 (需轉碼) | 原生支援 |
| 存儲空間 | 中文 2 bytes | 中文 3-4 bytes |
| 生態相容性 | 舊系統、中文環境 | 現代標準、國際化、Web 應用 |
| 建議場景 | 純中文內部系統、舊專案維護 | 新專案、Web、API、多語言、Emoji |
character-set-server 未改,存入數據仍按 latin1 處理,讀取時雙重轉碼導致亂碼ALTER DATABASE ... CHARSET=gbk, ALTER TABLE ... CONVERT TO CHARACTER SET gbkchcp 65001 切換 UTF-8 模式characterEncoding=gbk 或 utf8mb4# 1. 停止服務
Stop-Service -Name MySQL80 -Force -ErrorAction SilentlyContinue
# 2. 備份並修改 my.ini
$ini = "C:\ProgramData\MySQL\MySQL Server 8.0\my.ini"
cp $ini "$ini.bak.$(Get-Date -Format 'yyyyMMdd')"
$content = Get-Content $ini -Raw
$content = $content -replace '(?s)(?<=\[client\]).*?(?=\[)', "`ndefault-character-set = utf8mb4`n"
$content = $content -replace '(?s)(?<=\[mysql\]).*?(?=\[)', "`ndefault-character-set = utf8mb4`n"
$content = $content -replace '(?s)(?<=\[mysqld\]).*?(?=\[)', "`ncharacter-set-server = utf8mb4`ncollation-server = utf8mb4_unicode_ci`n"
Set-Content $ini $content -Encoding UTF8
# 3. 啟動服務
Start-Service -Name MySQL80
# 4. 驗證
mysql -e "SHOW VARIABLES LIKE 'character_set%'; SELECT '中文測試';"