在前幾個版本的客戶端程式中,連線參數(主機名、用戶名、密碼等)都是寫死在原始碼裡的。這意味著每次更改參數都得重新編譯,極不方便,尤其當程式要分發給他人使用時。MySQL 客戶端程式四(client4)解決了這個問題:它支援在運行時透過命令列選項或選項檔(如 ~/.my.cnf)指定連線參數,並且處理邏輯與標準 MySQL 客戶端工具(如 mysql、mysqldump)保持一致。
load_defaults() 與選項檔MySQL 客戶端庫提供了 load_defaults() 函式,能自動讀取選項檔(/etc/my.cnf、~/.my.cnf 等),解析指定的群組(預設至少包含 [client]),並將裡面的參數以命令列選項的形式插入到 argv[] 陣列的開頭。這樣一來,後續的命令列解析迴圈就能像處理使用者手動輸入的參數一樣處理這些值。若命令列也提供了同樣的參數,因為出現在較後位置,會覆蓋選項檔的值,符合預期的優先權規則。
範例程式 show_argv 展示了 argv[] 在呼叫 load_defaults() 前後的變化。只需幾行程式碼:
groups[](以 NULL 結尾)。my_init() 初始化。load_defaults("my", groups, &argc, &argv)。此外,還可加入程式專屬的群組(如 [show_argv]),讓專屬設定優先於通用 [client] 設定。
load_defaults() 不會 讀取環境變數(如 MYSQL_TCP_PORT)。若需支援,須自行用 getenv() 讀取,且必須在呼叫 load_defaults() 或解析命令列之前檢查,以符合標準客戶端的優先權順序:環境變數 < 選項檔 < 命令列。
getopt_long()將所有參數整合到 argv[] 後,使用 getopt_long() 進行解析。此函式內建於 MySQL 客戶端庫,支援短選項(如 -h)與長選項(如 --host),並能處理選項值的「必選、可選、無參數」三種模式。範例程式 show_param 完整演示了:
argv[]。load_defaults() 後列印修改過的 argv[]。getopt_long() 解析後,列印最終參數值與剩餘參數。特別注意密碼選項(-p/--password)採用可選參數設計:若僅給 -p 不給值,程式會提示使用者輸入,避免密碼出現在命令列中被 ps 等工具窺視。
client4.c)的關鍵改進相比前三版,client4 新增了實用功能:
argv[] 中清除,縮小密碼在進程表曝露的時間窗口(雖無法完全消除命令列傳遞密碼的風險)。get_tty_password()(跨平台、不回顯)提示輸入。最終框架讓開發者只需:
client4.c。do_connect() 與 do_disconnect() 之間填入業務邏輯。即可快速建立健壯的 MySQL 客戶端應用。