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() | 回傳伺服器版本字串 |
SELECT BENCHMARK(1000000, ENCODE('hello','goodbye'));
-- 回傳 0,客戶端顯示耗時 4.74 sec
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 | 顯式 COLLATE | COLLATE latin1_swedish_ci |
| 1 | 無排序規則 | 不同排序規則字串串接 |
| 2 | 隱式排序規則 | 欄位值、程序參數、區域變數 |
| 3 | 系統常數 | USER()、VERSION() |
| 4 | 可強制 | 字面字串 |
| 5 | 可忽略 | NULL 或衍生自 NULL |
SELECT CONNECTION_ID(); -- 23786
對應 INFORMATION_SCHEMA.PROCESSLIST.ID、SHOW PROCESSLIST.Id、Performance Schema threads.PROCESSLIST_ID。
SELECT USER(); -- 'davida@localhost' (客戶端指定) SELECT CURRENT_USER(); -- '@localhost' (伺服器實際認證帳號)
USER():客戶端連線時提供的帳號CURRENT_USER():伺服器實際用於認證的帳號(決定權限)CURRENT_USER() 回傳 DEFINER 帳號(除非 SQL SECURITY INVOKER)SELECT DATABASE(); -- 'test' 或 NULL(無預設 DB)
預存程序中回傳程序關聯的資料庫,不一定等於呼叫端的預設 DB。
SELECT SQL_CALC_FOUND_ROWS * FROM tbl WHERE id > 100 LIMIT 10; SELECT FOUND_ROWS(); -- 總符合筆數(無 LIMIT 時)
SQL_CALC_FOUND_ROWSINSERT 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 IGNORE 失敗時值不變;InnoDB innodb_autoinc_lock_mode 影響計數器行為UPDATE seq SET id=LAST_INSERT_ID(id+1); SELECT LAST_INSERT_ID(); 可模擬序列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 版本後規則:
對應 C API
mysql_affected_rows()與 mysql 客戶端顯示的列數。
SELECT VERSION(); -- '5.5.53-standard'
SCHEMA() = DATABASE()SESSION_USER() = SYSTEM_USER() = USER()熟悉這些資訊函數,可在預存程序、觸發器、應用程式中精確取得執行環境與操作結果的中繼資料。