連接 MySQL 服務後,通常存在多個資料庫,必須顯式選擇目標資料庫才能進行後續操作。本文詳解命令列交互式切換與 PHP 應用層程式化選擇兩種核心場景,並延伸至連接池配置最佳實踐。
# 1. 登錄 MySQL mysql -u root -p Enter password: ****** # 2. 查看可用資料庫 SHOW DATABASES; # 3. 切換目標資料庫 USE TUTORIALS; -- 輸出:Database changed # 4. 驗證當前資料庫 SELECT DATABASE(); -- 輸出:TUTORIALS
lower_case_table_names 影響)USE 僅影響當前連接會話,斷開重連需重新執行USAGE 權限<?php
$dbhost = 'localhost:3036';
$dbuser = 'guest';
$dbpass = 'guest123';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if (!$conn) {
die('Could not connect: ' . mysql_error());
}
echo 'Connected successfully';
// 選擇資料庫
mysql_select_db('TUTORIALS', $conn);
mysql_close($conn);
?>
函數原型:bool mysql_select_db(string $database_name, resource $link_identifier = null)
<?php
$mysqli = new mysqli('localhost', 'user', 'pass', 'TUTORIALS', 3306);
if ($mysqli->connect_errno) {
die('Connect failed: ' . $mysqli->connect_error);
}
// 連接構造函數已指定資料庫,無需額外選擇
// 運行時切換:
$mysqli->select_db('OTHER_DB');
// 預處理語句範例
$stmt = $mysqli->prepare('SELECT * FROM users WHERE id = ?');
$stmt->bind_param('i', $id);
$stmt->execute();
$stmt->close();
$mysqli->close();
?>
<?php
$dsn = 'mysql:host=localhost;port=3306;dbname=TUTORIALS;charset=utf8mb4';
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
$pdo = new PDO($dsn, 'user', 'pass', $options);
// DSN 已指定 dbname,運行時切換:
$pdo->exec('USE OTHER_DB');
// 預處理
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?');
$stmt->execute([$id]);
$users = $stmt->fetchAll();
?>
| 場景 | 策略 | 實現要點 |
|---|---|---|
| 單一應用單一資料庫 | 連接字串指定 dbname | DSN/JDBC URL 含 database 參數,無運行時切換 |
| 單一應用多資料庫(邏輯隔離) | 多連接池,各綁定一庫 | Spring: @Primary DataSource + @Qualifier 區分;HikariCP 多實例 |
| 多租戶共享結構 | 連接後執行 USE tenant_db | 攔截器/Filter 根據租戶上下文動態切換,注意連接池污染 |
| 讀寫分離中間件 | 透明路由,無感知切換 | ProxySQL/ShardingSphere/MyCat 處理,應用單一連接 |
GRANT USAGE ON db.* TO 'user'@'host';mysql_select_db/select_db 返回 true,檢查大小寫資料庫選擇看似簡單,實則是連接管理、權限模型、多租戶架構的關鍵節點。新專案強制使用 PDO/mysqli+預處理,棄用 mysql_*;連接池層面按業務邊界劃分連接池實例,避免運行時 USE 造成連接狀態混亂;中間件層下沉路由邏輯,應用層保持單一連接模型。