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

MySQL 資訊函數完整參考:BENCHMARK、CONNECTION_ID、LAST_INSERT_ID 等 18 種函數詳解

     編輯:MySQL 綜合教學

MySQL 資訊函數完整參考

MySQL 提供 18 種資訊函數,用於取得伺服器版本、連線資訊、字元集、排序規則、最後自增 ID、影響列數等中繼資料。本文依官方文件分類詳解每個函數語法、回傳值、使用範例與注意事項。

一、函數總覽表

函數功能
BENCHMARK(count, expr)重複執行表達式 count 次,測量效能(回傳 0)
CHARSET(str)回傳字串的字元集
COERCIBILITY(str)回傳字串的排序規則強制性值(0-5,越小優先權越高)
COLLATION(str)回傳字串的排序規則名稱
CONNECTION_ID()回傳目前連線的執行緒 ID
CURRENT_USER()回傳認證時的使用者@主機(決定權限)
DATABASE() / SCHEMA()回傳預設資料庫名稱
FOUND_ROWS()配合 SQL_CALC_FOUND_ROWS 取得無 LIMIT 時的總列數
LAST_INSERT_ID([expr])取得/設定最後一條 INSERT 產生的 AUTO_INCREMENT 值
ROW_COUNT()取得前一條陳述式影響的列數
SESSION_USER() / SYSTEM_USER() / USER()回傳客戶端提供的使用者@主機
VERSION()回傳伺服器版本字串

二、重點函數深度解析

1. BENCHMARK(count, expr) — 效能微基準測試

SELECT BENCHMARK(1000000, ENCODE('hello','goodbye'));
-- 回傳 0,客戶端顯示耗時 4.74 sec
  • 僅接受純量表達式(單欄單列)
  • 移除解析/優化/鎖定開銷,專測執行引擎效能
  • 建議多次執行取平均,避免系統負載干擾

2. CHARSET() / COLLATION() / COERCIBILITY() — 字元集與排序規則

SELECT CHARSET('abc');                    -- latin1
SELECT CHARSET(CONVERT('abc' USING utf8)); -- utf8
SELECT COLLATION('abc');                   -- latin1_swedish_ci
SELECT COERCIBILITY('abc' COLLATE latin1_swedish_ci); -- 0 (顯式)
SELECT COERCIBILITY(USER());               -- 3 (系統常數)
SELECT COERCIBILITY('abc');                -- 4 (可強制)

強制性層級(0 最高):

值意義範例
0顯式 COLLATECOLLATE latin1_swedish_ci
1無排序規則不同排序規則字串串接
2隱式排序規則欄位值、程序參數、區域變數
3系統常數USER()、VERSION()
4可強制字面字串
5可忽略NULL 或衍生自 NULL

3. CONNECTION_ID() — 連線識別

SELECT CONNECTION_ID();  -- 23786

對應 INFORMATION_SCHEMA.PROCESSLIST.ID、SHOW PROCESSLIST.Id、Performance Schema threads.PROCESSLIST_ID。

4. CURRENT_USER() vs USER() — 關鍵差異

SELECT USER();         -- 'davida@localhost' (客戶端指定)
SELECT CURRENT_USER(); -- '@localhost'       (伺服器實際認證帳號)
  • USER():客戶端連線時提供的帳號
  • CURRENT_USER():伺服器實際用於認證的帳號(決定權限)
  • 預存程序/檢視表/觸發器/事件中,CURRENT_USER() 回傳 DEFINER 帳號(除非 SQL SECURITY INVOKER)

5. DATABASE() / SCHEMA() — 目前資料庫

SELECT DATABASE();  -- 'test' 或 NULL(無預設 DB)

預存程序中回傳程序關聯的資料庫,不一定等於呼叫端的預設 DB。

6. FOUND_ROWS() — 分頁查詢總筆數

SELECT SQL_CALC_FOUND_ROWS * FROM tbl WHERE id > 100 LIMIT 10;
SELECT FOUND_ROWS();  -- 總符合筆數(無 LIMIT 時)
  • 需在 SELECT 加 SQL_CALC_FOUND_ROWS
  • 結果暫時性,緊接下一陳述式後失效,需用變數保存
  • 複寫注意: Statement-based 複寫不可靠,Row-based 正常

7. LAST_INSERT_ID([expr]) — 自增 ID 追蹤

INSERT INTO t (name) VALUES ('Bob');
SELECT LAST_INSERT_ID();  -- 1

INSERT INTO t (name) VALUES ('Mary'), ('Jane'), ('Lisa');
SELECT LAST_INSERT_ID();  -- 2 (僅回傳第一筆產生的 ID)
  • 連線層級維護,不受其他連線影響
  • 多列 INSERT 僅回傳第一筆 ID(利於跨伺服器重現)
  • INSERT IGNORE 失敗時值不變;InnoDB innodb_autoinc_lock_mode 影響計數器行為
  • 帶參數形式:UPDATE seq SET id=LAST_INSERT_ID(id+1); SELECT LAST_INSERT_ID(); 可模擬序列

8. ROW_COUNT() — 影響列數

INSERT INTO t VALUES(1),(2),(3);
SELECT ROW_COUNT();  -- 3

DELETE FROM t WHERE i IN(1,2);
SELECT ROW_COUNT();  -- 2

5.5.5 版本後規則:

  • DDL:0
  • DML (非 SELECT):影響列數
  • SELECT 有結果集:-1;無結果集(如 INTO OUTFILE):寫入列數
  • SIGNAL:0

對應 C API mysql_affected_rows() 與 mysql 客戶端顯示的列數。

9. VERSION() — 伺服器版本

SELECT VERSION();  -- '5.5.53-standard'
  • Statement-based 複寫不安全(5.5.1+ 會記錄警告)

三、同義函數對照

  • SCHEMA() = DATABASE()
  • SESSION_USER() = SYSTEM_USER() = USER()

熟悉這些資訊函數,可在預存程序、觸發器、應用程式中精確取得執行環境與操作結果的中繼資料。

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