二進制客戶端連接
標準連接命令
# 本地連接
mysql -u root -p
# 遠程連接
mysql -h 192.168.1.100 -u app -p -P 3306
# 指定默認庫
mysql -u root -p testdb
# 直接執行 SQL
mysql -u root -p -e "SHOW DATABASES;"
# 批量模式 (適合腳本)
mysql -u root -p --batch --silent -e "SELECT * FROM t" testdb
連接參數速查
| 參數 | 短參數 | 說明 |
--host | -h | 服務器主機名/IP |
--user | -u | 用戶名 |
--password | -p | 密碼 (緊跟無空格或交互輸入) |
--port | -P | 端口號 (默認 3306) |
--database | -D | 默認數據庫 |
--socket | -S | Unix Socket 文件路徑 |
--execute | -e | 直接執行 SQL 語句 |
--batch | -B | 表格輸出 (Tab 分隔),非交互格式 |
--vertical | -E | 垂直顯示結果集 |
--ssl-mode | | REQUIRED/PREFERRED/DISABLED |
退出客戶端
EXIT; \q QUIT Ctrl+D
PHP 連接 MySQL:mysqli 與 PDO
mysqli 面向對象 (推薦)
<?php
$host = 'localhost'; $user = 'root'; $pass = 'pass'; $db = 'testdb';
$mysqli = new mysqli($host, $user, $pass, $db);
if ($mysqli->connect_errno) {
die('Connect failed [' . $mysqli->connect_errno . ']: ' . $mysqli->connect_error);
}
// 設置字符集
$mysqli->set_charset('utf8mb4');
// 執行查詢
$result = $mysqli->query('SELECT VERSION()');
$row = $result->fetch_row();
echo 'MySQL Version: ' . $row[0];
// 關閉連接 (腳本結束自動關閉,長連接池需手動)
$mysqli->close();
?>
mysqli 過程式風格
$link = mysqli_connect('localhost', 'root', 'pass', 'testdb');
if (!$link) die('Connect failed: ' . mysqli_connect_error());
mysqli_set_charset($link, 'utf8mb4');
mysqli_close($link);
PDO (數據庫無關、預處理更優雅)
<?php
$dsn = 'mysql:host=localhost;dbname=testdb;charset=utf8mb4';
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false, // 真實預處理
];
try {
$pdo = new PDO($dsn, 'root', 'pass', $options);
$stmt = $pdo->query('SELECT VERSION()');
echo 'Version: ' . $stmt->fetchColumn();
} catch (PDOException $e) {
die('Connection failed: ' . $e->getMessage());
}
?>
mysqli 核心函數速查表
| 分類 | 函數/方法 | 用途 |
| 連接管理 | mysqli_connect() / new mysqli() | 建立連接 |
mysqli_close() / $mysqli->close() | 關閉連接 |
mysqli_ping() / $mysqli->ping() | 檢查連接存活,斷線重連 |
mysqli_change_user() | 切換用戶/數據庫 |
| 查詢執行 | mysqli_query() / $mysqli->query() | 執行單條 SQL (返回結果集/布爾) |
mysqli_prepare() / $mysqli->prepare() | 預處理語句 |
mysqli_stmt_execute() / $stmt->execute() | 執行預處理 |
mysqli_stmt_bind_param() / $stmt->bind_param() | 綁定參數 |
mysqli_stmt_bind_result() / $stmt->bind_result() | 綁定結果列 |
| 結果集處理 | mysqli_fetch_assoc() / $result->fetch_assoc() | 取關聯數組 |
mysqli_fetch_array() / $result->fetch_array() | 取混合數組 |
mysqli_fetch_object() / $result->fetch_object() | 取對象 |
mysqli_free_result() / $result->free() | 釋放結果集內存 |
| 事務控制 | mysqli_autocommit() / $mysqli->autocommit() | 開關自動提交 |
mysqli_commit() / $mysqli->commit() | 提交事務 |
mysqli_rollback() / $mysqli->rollback() | 回滾事務 |
| 元數據 | mysqli_insert_id() / $mysqli->insert_id | 獲取自增 ID |
mysqli_affected_rows() / $mysqli->affected_rows | 影響行數 |
mysqli_error() / $mysqli->error | 錯誤信息 |
連接池與長連接最佳實踐
- PHP-FPM 工作進程模型下,每請求建立連接開銷可接受,通常不需要顯式連接池
- 若使用 Swoole/RoadRunner 等常駐內存框架,需自行實現連接池 (
mysqli::real_connect 復用)
- 持久連接
mysqli_pconnect() / PDO::ATTR_PERSISTENT 易導致「Too many connections」、事務殘留、狀態污染,生產環境不推薦
- 監控
Threads_connected、Aborted_connects、Connection_errors_internal
常見連接錯誤排查
| 錯誤碼/信息 | 原因 | 解決 |
| 1045 Access denied | 用戶/密碼/主機不匹配 | 檢查 mysql.user Host 列、密碼插件、防火牆 |
| 2003 Can't connect | 網絡不通/端口錯誤/服務未啟動 | telnet host 3306、檢查 bind_address、防火牆 |
| 2006 MySQL server has gone away | 連接超時/數據包過大/服務重啟 | 增大 wait_timeout/max_allowed_packet、重連機制 |
| 1040 Too many connections | 連接數達上限 | 增大 max_connections、排查泄漏、連接池 |
| SSL connection error | SSL 證書/協議不匹配 | 指定 --ssl-mode=DISABLED 或修復證書 |