首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 選擇資料庫完整指南:命令列與 PHP 兩種方式詳解

     編輯:MySQL 綜合教學

MySQL 資料庫切換操作:從交互式客戶端到應用層連接池

連接 MySQL 服務後,通常存在多個資料庫,必須顯式選擇目標資料庫才能進行後續操作。本文詳解命令列交互式切換與 PHP 應用層程式化選擇兩種核心場景,並延伸至連接池配置最佳實踐。

一、命令列交互式切換

# 1. 登錄 MySQL
mysql -u root -p
Enter password: ******

# 2. 查看可用資料庫
SHOW DATABASES;

# 3. 切換目標資料庫
USE TUTORIALS;
-- 輸出:Database changed

# 4. 驗證當前資料庫
SELECT DATABASE();
-- 輸出:TUTORIALS

關鍵注意事項

  • 大小寫敏感:Linux 下資料庫名/表名/欄位名嚴格區分大小寫(受 lower_case_table_names 影響)
  • 會話級別:USE 僅影響當前連接會話,斷開重連需重新執行
  • 權限檢查:需對目標資料庫擁有至少 USAGE 權限

二、PHP 程式化選擇資料庫

1. 歷史 mysql_* 擴展(已棄用,僅維護舊專案參考)

<?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)

2. 現代 mysqli 擴展(面向過程/物件雙模式)

<?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();
?>

3. PDO 抽象層(推薦新專案標準)

<?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();
?>

三、連接池與資料庫選擇最佳實踐

場景策略實現要點
單一應用單一資料庫連接字串指定 dbnameDSN/JDBC URL 含 database 參數,無運行時切換
單一應用多資料庫(邏輯隔離)多連接池,各綁定一庫Spring: @Primary DataSource + @Qualifier 區分;HikariCP 多實例
多租戶共享結構連接後執行 USE tenant_db攔截器/Filter 根據租戶上下文動態切換,注意連接池污染
讀寫分離中間件透明路由,無感知切換ProxySQL/ShardingSphere/MyCat 處理,應用單一連接

四、常見問題與排查

  • ERROR 1044 (42000): Access denied for user ''@'%' to database 'db':權限不足,GRANT USAGE ON db.* TO 'user'@'host';
  • SELECT DATABASE() 返回 NULL:未執行 USE 或連接字串未指定 dbname
  • PHP 切換後查詢報表不存在:確認 mysql_select_db/select_db 返回 true,檢查大小寫
  • PDO: SQLSTATE[HY000] [1049] Unknown database:DSN 中 dbname 拼寫錯誤或未建立

五、總結

資料庫選擇看似簡單,實則是連接管理、權限模型、多租戶架構的關鍵節點。新專案強制使用 PDO/mysqli+預處理,棄用 mysql_*;連接池層面按業務邊界劃分連接池實例,避免運行時 USE 造成連接狀態混亂;中間件層下沉路由邏輯,應用層保持單一連接模型。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved