MySQL 連線是應用與資料庫交互的橋樑。本文系統對比 命令列二進制客戶端、PHP mysqli (程序/物件導向)、PHP PDO 三大連線範式,解析參數詳情、錯誤處理、連線池整合與安全最佳實踐,助您選對連線方式、寫出健壯代碼。
官方提供的互動式/批次式客戶端,適用於管理運維、腳本自動化、快速驗證。
mysql -u root -p -h 127.0.0.1 -P 3306 # -u 用戶名 # -p 密碼(不帶值互動輸入,帶值無空格 -pPass123) # -h 主機 (127.0.0.1 強制 TCP,localhost 走 Socket) # -P 連接埠 (大寫 P) # --protocol=TCP|SOCKET|PIPE|MEMORY 強制協議
# 執行單條 SQL 退出 (自動化腳本) mysql -u root -p -e "SHOW GLOBAL STATUS LIKE 'Threads_connected';" # 批次模式輸出 TSV (程式處理友善) mysql -u root -p -B -e "SELECT * FROM users" > users.tsv # 垂直顯示 (寬表閱讀) mysql -u root -p -E -e "SHOW ENGINE INNODB STATUS\G" # 指定字符集 mysql -u root -p --default-character-set=utf8mb4 # 讀取 SQL 檔執行 mysql -u root -p db_name < schema.sql
mysql> exit; mysql> quit; mysql> \q
mysql_connect()、mysql_query() 等 mysql_* 函數 PHP 5.5 棄用、PHP 7.0 移除。存量專案必須遷移至 mysqli 或 PDO。
<?php
$host = '127.0.0.1';
$port = 3306;
$user = 'app_user';
$pass = 'StrongP@ssw0rd';
$db = 'app_db';
$charset = 'utf8mb4';
$mysqli = new mysqli($host, $user, $pass, $db, $port);
if ($mysqli->connect_errno) {
throw new Exception("連線失敗: " . $mysqli->connect_error);
}
$mysqli->set_charset($charset);
// 關鍵:關閉自動提交,手動控制交易
$mysqli->autocommit(false);
try {
$mysqli->begin_transaction();
// 業務 SQL...
$mysqli->commit();
} catch (Exception $e) {
$mysqli->rollback();
throw $e;
} finally {
$mysqli->close();
}
?>
$stmt = $mysqli->prepare("SELECT id, name, email FROM users WHERE status = ? AND created_at > ?");
$stmt->bind_param("is", $status, $date); // i=integer, s=string, d=double, b=blob
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
// 處理行...
}
$stmt->close();
<?php
$dsn = "mysql:host=127.0.0.1;port=3306;dbname=app_db;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/ca.pem', // SSL 憑證 (生產必備)
];
try {
$pdo = new PDO($dsn, 'app_user', 'StrongP@ssw0rd', $options);
// 業務操作...
} catch (PDOException $e) {
error_log("DB 連線失敗: " . $e->getMessage());
throw new Exception("資料庫服務暫時不可用");
}
$stmt = $pdo->prepare("INSERT INTO orders (user_id, amount, currency) VALUES (?, ?, ?)");
$stmt->execute([$userId, $amount, 'TWD']);
$pdo->beginTransaction();
try {
$pdo->exec("UPDATE accounts SET balance = balance - $amount WHERE user_id = $userId");
$pdo->exec("INSERT INTO transactions ... VALUES (...)");
$pdo->commit();
} catch (Exception $e) {
$pdo->rollBack();
throw $e;
}
| 參數 | mysqli | PDO DSN | 說明 |
|---|---|---|---|
| 主機 | $host | host= | IP 或主機名 |
| 埠 | $port | port= | 預設 3306 |
| 用戶 | $user | 用戶名參數 | |
| 密碼 | $pass | 密碼參數 | |
| 資料庫 | $db (建構子) / select_db() | dbname= | 預設資料庫 |
| 字符集 | set_charset() | charset= | utf8mb4 |
| SSL | ssl_set() | MYSQL_ATTR_SSL_* | 生產必啟用 |
| 壓縮 | CLIENT_COMPRESS | MYSQL_ATTR_COMPRESS | 跨網段大數據傳輸 |
| 超時 | options(MYSQLI_OPT_CONNECT_TIMEOUT) | MYSQL_ATTR_INIT_COMMAND | 連線/讀寫超時控制 |
// mysqli 持久連線 (啟用 p: 前綴)
$mysqli = new mysqli('p:127.0.0.1', 'user', 'pass', 'db', 3306);
// PDO 持久連線
$pdo = new PDO($dsn, 'user', 'pass', [
PDO::ATTR_PERSISTENT => true,
// ...其他選項
]);
// php-fpm.conf 關鍵設定
; pm.max_children = 100
; pm.start_servers = 20
; pm.min_spare_servers = 10
; pm.max_spare_servers = 30
; 請確保 max_children × 連線數 ≤ MySQL max_connections
fastcgi_finish_request 或 register_shutdown_function 強制清理wait_timeout=300、interactive_timeout=300 定期回收SELECT, INSERT, UPDATE, DELETE,無 DDL、無 GRANT、無 FILEREQUIRE SSL,verify_server_cert=ON連線方式雖非業務核心,卻是穩定性、安全性、可維護性的基石。選對工具、用對模式、守住底線,讓資料庫連線成為最可靠的隱形基礎設施。