Windows 原生 mysql.exe 在 Cygwin/Mintty 終端中無法正常交互(密碼提示掛起),根因是 Windows 主控台子系統與 POSIX tty 不兼容。解決方案是在 Cygwin 環境下編譯原生 MySQL 客戶端,實現完美的終端交互體驗。本文記錄完整編譯流程、配置優化與亂碼處理。
# 1. 安裝 Cygwin 基礎包 + 開發工具鏈 # setup-x86_64.exe 選擇安裝: # Devel: gcc-g++, make, cmake, pkg-config # Libs: libreadline-devel, libncurses-devel, openssl-devel, zlib-devel # Net: wget, openssh # Editors: vim # 2. 下載 MySQL 源碼(以 5.5 為例,8.0 需 C++17 支援) cd /usr/src wget https://dev.mysql.com/get/Downloads/MySQL-5.5/mysql-5.5.62.tar.gz tar zxvf mysql-5.5.62.tar.gz cd mysql-5.5.62
# 關鍵:--without-server 只編譯客戶端,--without-readline 使用系統 readline 避免編譯錯誤
./configure \
--prefix=/usr/local/mysql-client \
--without-server \
--without-readline \
--with-ssl \
--with-zlib-dir=/usr \
CFLAGS="-O2 -pipe" \
CXXFLAGS="-O2 -pipe"
make -j$(nproc)
make install
# 複製配置模板 cp support-files/my-default.cnf /etc/my.cnf # 編輯 /etc/my.cnf cat >> /etc/my.cnf <<'EOF' [client] port = 3306 socket = /tmp/mysql.sock protocol = TCP # 強制 TCP,避免 Unix socket 找不到 default-character-set = utf8mb4 [mysql] no-auto-rehash # 啟動更快 auto-vertical-output # 寬表自動垂直顯示 prompt="\\u@\\h [\\d]> " # 友好提示符 EOF
# 確保 Windows MySQL 服務運行且防火牆開放 3306 # 測試連接 /usr/local/mysql-client/bin/mysql -h 127.0.0.1 -u root -p # 加入 PATH echo 'export PATH="/usr/local/mysql-client/bin:$PATH"' >> ~/.bashrc source ~/.bashrc # 現在可直接使用 mysql 命令 mysql -h 127.0.0.1 -u root -p
根因: Windows 系統預設代碼頁為 GBK (CP936),Mintty 預設 UTF-8。執行 Windows 原生命令(ping、ipconfig、mysql.exe)輸出 GBK,在 UTF-8 終端顯示亂碼;反之亦然。
| 方案 | 優點 | 缺點 |
|---|---|---|
| Mintty 設為 GBK (Locale=C, Charset=GBK) | Windows 原生命令正常 | Linux 工具、SSH 遠端、Git 輸出亂碼 |
Mintty 保持 UTF-8,Windows 命令用 iconv -f GBK -t UTF-8 管道轉碼 | Linux 生態完美 | 需包裝每個 Windows 命令 |
推薦:全鏈路 UTF-8。Windows 10 1903+ 支援 chcp 65001,終端設為 UTF-8,MySQL 客戶端 default-character-set=utf8mb4 | 統一編碼,無轉換損耗 | 舊版 Windows 不支援 |
| 錯誤 | 原因 | 解決 |
|---|---|---|
readline.h not found | 缺少 libreadline-devel | apt-cyg install libreadline-devel 或 Cygwin 安裝器勾選 |
ssl library not found | 缺少 openssl-devel | apt-cyg install openssl-devel |
undefined reference to `mysql_... | 未連結 libmysqlclient | 確認 --with-ssl、--with-zlib-dir 路徑正確 |
| 編譯極慢 | Cygwin fork/IO 效能低 | 使用 make -j1、關閉殺毒軟體、考慮 MSYS2/WSL 替代 |
編譯原生 Cygwin MySQL 客戶端,能在 Mintty 中獲得完整的交互體驗(密碼提示、自動補全、Ctrl+C 信號處理),是 Windows 上進行 MySQL 開發運維的最佳選擇之一。