網上流傳在 [mysqld] 加 default-character-set=utf8 會導致 MySQL 無法啟動。正確做法:[client] 設客戶端字符集,[mysqld] 設服務端字符集與排序規則。
錯誤示範(導致 Error 2003)
[mysqld]
default-character-set = utf8 # ❌ 服務端不認此參數,啟動失敗
正確配置 /etc/my.cnf
[client]
default-character-set = utf8mb4
[mysqld]
default-storage-engine = INNODB
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
# 可選:強制客戶端連線字符集
[mysql]
default-character-set = utf8mb4
關鍵點解析
| 參數 | 作用域 | 說明 |
| default-character-set | 客戶端 | [client]、[mysql]、[mysqldump] 等讀取,影響連線握手字符集 |
| character-set-server | 服務端 | Server 級預設字符集,新建庫/表繼承 |
| collation-server | 服務端 | Server 級預設排序規則 |
| default-storage-engine | 服務端 | 建表預設引擎,建議 InnoDB |
macOS 專用:無 /etc/my.cnf 怎麼辦?
- 複製範本:
sudo cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf
- 編輯上述參數。
- 重啟:
sudo /Library/StartupItems/MySQLCOM/MySQLCOM restart
Linux 重啟
systemctl restart mysqld
# 或
service mysql restart
驗證生效
mysql -e "SHOW VARIABLES LIKE 'character_set%';"
mysql -e "SHOW VARIABLES LIKE 'collation%';"
-- 應見 character_set_server=utf8mb4, collation_server=utf8mb4_general_ci
避坑提醒
- utf8 vs utf8mb4:MySQL
utf8 實為 utf8mb3(最多 3 字節),**不支援 Emoji/補充字符**。生產環境**強制 utf8mb4**。
- 既有表/庫不自動轉換:需逐表
ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;。
- 應用層連線字符集:JDBC
characterEncoding=utf8mb4、Python charset='utf8mb4'、Go charset=utf8mb4,否則握手仍用 latin1。
總結
MySQL 字符集配置核心:**客戶端讀 default-character-set,服務端讀 character-set-server/collation-server**。/etc/my.cnf 分區正確配置,重啟驗證,再配合應用層指定 utf8mb4,徹底解決中文亂碼與 Emoji 存儲問題。
- 上一篇文章: MySQL 如何避免 Swap?swappiness、O_DIRECT、memlock、HugePages 四大手段實戰
- 下一篇文章: MySQL 數據導出導入全攻略:mysqldump 參數詳解與 mysql 還原實戰
Copyright ©
程式碼之家 All Rights Reserved