MySQL 連線完全指南:命令列 mysql、PHP mysqli_connect、連線參數詳解與關閉最佳實踐
連線是應用與 MySQL 交互的入口。無論是命令列交互、腳本自動化、Web 應用連線池,掌握連線參數、認證方式、SSL/壓縮選項、連線關閉機制,對穩定性、安全性、效能至關重要。本文系統講解命令列、PHP mysqli、PDO 三大連線方式,並深度解析參數與最佳實踐。
一、命令列:mysql 客戶端
[root@host]# mysql -u root -p
Enter password:******
常用參數
| 參數 |
說明 |
範例 |
-u, --user | 用戶名 | -u root |
-p, --password | 密碼(不帶值會提示輸入,帶值如 -ppwd 無空格) | -p 或 -psecret |
-h, --host | 主機(預設 localhost) | -h 192.168.1.100 |
-P, --port | 埠號(預設 3306) | -P 3307 |
-D, --database | 預設資料庫 | -D RUNOOB |
--protocol | 協議:TCP、SOCKET、PIPE、MEMORY | --protocol=TCP |
--ssl-mode | SSL 模式:DISABLED、PREFERRED、REQUIRED、VERIFY_CA、VERIFY_IDENTITY | --ssl-mode=REQUIRED |
--compress | 啟用壓縮協議(低頻寬網路提升傳輸速度) | --compress |
登入成功後
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2854760
Server version: 8.0.36 MySQL Community Server
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> -- 現在可以執行任何 SQL
mysql> EXIT; -- 或 QUIT、\q 退出
Bye
二、PHP mysqli 連線
mysqli_connect() 參數詳解
$link = mysqli_connect(
$host, // 主機:'localhost'、'127.0.0.1'、'host:port'、'/path/to/socket'
$user, // 用戶名
$passwd, // 密碼
$dbname, // 預設資料庫(可選)
$port, // 埠號(可選,預設 3306)
$socket // Unix socket 路徑(可選)
);
- 返回連線物件(
mysqli)或 false。
new mysqli(...) 物件風格等價,推薦使用。
- 預設非持久連線,腳本結束自動關閉。持久連線用
mysqli_pconnect() / p: 前綴,需謹慎管理連線池。
客戶端旗標(client_flags)
| 常數 |
作用 |
MYSQLI_CLIENT_SSL | 啟用 SSL 加密傳輸 |
MYSQLI_CLIENT_COMPRESS | 啟用壓縮協議 |
MYSQLI_CLIENT_IGNORE_SPACE | 允許函數名後有空格 |
MYSQLI_CLIENT_INTERACTIVE | 使用 interactive_timeout 而非 wait_timeout |
MYSQLI_CLIENT_FOUND_ROWS | UPDATE 返回匹配行數而非影響行數 |
$link = mysqli_connect($host, $user, $pass, $db, $port, $socket,
MYSQLI_CLIENT_SSL | MYSQLI_CLIENT_COMPRESS);
連線錯誤處理
$conn = new mysqli($host, $user, $pass, $db);
if ($conn->connect_error) {
error_log('MySQL Connect Failed: ' . $conn->connect_error);
die('Database connection failed');
}
$conn->set_charset('utf8mb4'); -- 關鍵:設定連線字符集
三、PDO 連線(現代專案首選)
$dsn = 'mysql:host=localhost;port=3306;dbname=RUNOOB;charset=utf8mb4';
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false, -- 使用原生預處理
PDO::MYSQL_ATTR_SSL_CA => '/path/to/ca.pem', -- SSL 憑證
];
$pdo = new PDO($dsn, $user, $pass, $options);
四、連線關閉:mysqli_close() / PDO=null
- 非持久連線:腳本結束自動關閉,通常無需顯式呼叫
mysqli_close()。
- 持久連線:
mysqli_close() 不會關閉持久連線(歸還池中)。
- 顯式關閉場景:長時間運行腳本(CLI daemon)、釋放連線池槽位、預防「Too many connections」。
- PDO:
$pdo = null; 釋放連線。
五、連線池與效能最佳實踐
- Web 應用必用連線池:PHP-FPM + mysqli 持久連線(
p:host)或 PDO 持久屬性,避免每請求建連開銷。
- 連線字符集統一 utf8mb4:
SET NAMES utf8mb4 / DSN charset=utf8mb4 / $conn->set_charset('utf8mb4')。
- 生產環境強制 SSL:
REQUIRED 模式,驗證 CA,防中間人攻擊。
- 監控關鍵指標:
Threads_connected、Connection_errors_max_connections、Aborted_connects。
- 超時配置:
wait_timeout=28800(8h)、interactive_timeout=28800、max_connections 按實際峰值+餘量設定。
常見連線錯誤排查
| 錯誤 |
原因 |
解決 |
Access denied for user | 用戶/密碼/主機不匹配 | 核對 mysql.user、FLUSH PRIVILEGES、主機通配符 % |
Can't connect to MySQL server | 服務未啟動/埠錯誤/防火牆/skip-networking | 檢查服務、netstat -ltnp、防火牆、bind-address |
Too many connections | 達到 max_connections | 增大限制、修復連線洩漏、啟用連線池、檢查慢查詢堵塞 |
SSL connection error | 憑證過期/不匹配/CA 不信任 | 更新憑證、檢查 ssl_ca/ssl_cert/ssl_key 路徑 |
連線是資料庫交互的生命線。掌握參數全景、選對驅動(PDO 優先)、強制 utf8mb4、生產環境上 SSL、連線池管理、監控告警,讓每一次握手都安全、高效、可觀測。