首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

mysql_unbuffered_query 與 mysql_query 差異詳解與 mysql_data_seek 限制

     編輯:MySQL 資料庫相關知識

PHP 早期 MySQL 擴充函式中,mysql_query() 與 mysql_unbuffered_query() 的最大差異在於結果集的緩衝機制,這直接影響 mysql_data_seek() 等指標操作函式的可用性。

核心差異

  • mysql_query():預設緩衝模式,一次性將全部結果集讀入記憶體,支援 mysql_data_seek()、mysql_num_rows()、隨機存取列資料。
  • mysql_unbuffered_query():非緩衝模式,逐列串流讀取,記憶體佔用極低,但不支援 mysql_data_seek()、mysql_num_rows() 等需隨機存取的函式。

mysql_data_seek() 詳細說明

功能:移動結果集內部資料指標到指定列 (row 從 0 起算)。

bool mysql_data_seek(resource $result, int $row)
  • 參數:$result 為 mysql_query() 回傳的 resource;$row 為目標列號 (0 ~ mysql_num_rows-1)。
  • 回傳:成功 true,失敗 false (並發出 E_WARNING)。
  • 限制:僅能搭配 mysql_query() 使用,不可用於 mysql_unbuffered_query()。

程式碼範例:重複讀取結果集

$conn = mysql_connect('localhost','root','root');
mysql_query('SET NAMES gbk');
mysql_select_db('pw8',$conn);

$sql = "SELECT * FROM shop_district";
$result = mysql_query($sql,$conn);  // 必須用緩衝查詢

// 第一次遍歷
while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
    printf("ID: %s FID: %s Name: %s\n", $row[0], $row[1], $row[2]);
}

// 將指標重置到第 0 列
mysql_data_seek($result, 0);

// 第二次遍歷
while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
    printf("ID: %s FID: %s Name: %s\n", $row[0], $row[1], $row[2]);
}

mysql_free_result($result);

選擇建議

  • 結果集較小、需多次遍歷或隨機存取 → mysql_query()
  • 結果集極大 (百萬列以上)、單向讀取即可 → mysql_unbuffered_query() 節省記憶體

注意:mysql_* 函式已於 PHP 5.5 棄用、PHP 7.0 移除,新專案請改用 mysqli 或 PDO。

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