文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  函數與運算子  /  資訊函數

14.15 資訊函數

表格 14.20 資訊函數

名稱 描述
BENCHMARK() 重複執行運算式
CHARSET() 傳回引數的字元集
COERCIBILITY() 傳回字串引數的校對強制性值
COLLATION() 傳回字串引數的校對
CONNECTION_ID() 傳回連線的連線 ID (執行緒 ID)
CURRENT_ROLE() 傳回目前作用中的角色
CURRENT_USER(), CURRENT_USER 已驗證的使用者名稱和主機名稱
DATABASE() 傳回預設 (目前) 資料庫名稱
FOUND_ROWS() 對於具有 LIMIT 子句的 SELECT,如果沒有 LIMIT 子句,則會傳回的資料列數
ICU_VERSION() ICU 程式庫版本
LAST_INSERT_ID() 上次 INSERT 的 AUTOINCREMENT 資料行的值
ROLES_GRAPHML() 傳回代表記憶體角色子圖的 GraphML 文件
ROW_COUNT() 更新的資料列數
SCHEMA() DATABASE() 的同義詞
SESSION_USER() USER() 的同義詞
SYSTEM_USER() USER() 的同義詞
USER() 用戶端提供的使用者名稱和主機名稱
VERSION() 傳回指示 MySQL 伺服器版本的字串

  • BENCHMARK(count,expr)

    BENCHMARK() 函數會重複執行運算式 expr count 次。它可用於計時 MySQL 處理運算式的速度。結果值為 0,或對於不適當的引數 (例如 NULL 或負重複計數) 為 NULL

    其預期用途是在 mysql 用戶端內使用,它會報告查詢執行時間

    mysql> SELECT BENCHMARK(1000000,AES_ENCRYPT('hello','goodbye'));
    +---------------------------------------------------+
    | BENCHMARK(1000000,AES_ENCRYPT('hello','goodbye')) |
    +---------------------------------------------------+
    |                                                 0 |
    +---------------------------------------------------+
    1 row in set (4.74 sec)

    報告的時間是客戶端所經過的時間,而不是伺服器端的 CPU 時間。建議多次執行 BENCHMARK(),並考慮伺服器機器的負載程度來解讀結果。

    BENCHMARK() 旨在測量純量運算式的執行時間效能,這對於您使用它和解讀結果的方式有一些重大含義

    • 只能使用純量運算式。雖然運算式可以是子查詢,但它必須傳回單一資料行,而且最多只能傳回單一資料列。例如,如果資料表 t 有多個資料行或多個資料列,則 BENCHMARK(10, (SELECT * FROM t)) 會失敗。

    • 執行 SELECT expr 陳述式 N 次與執行 SELECT BENCHMARK(N, expr) 在所涉及的額外負荷量方面有所不同。這兩者具有非常不同的執行設定檔,您不應預期它們會花費相同的時間量。前者會讓剖析器、最佳化工具、資料表鎖定和執行階段評估各執行 N 次。後者僅涉及執行階段評估 N 次,而所有其他元件僅執行一次。已配置的記憶體結構會重複使用,而執行階段最佳化 (例如已針對彙總函數評估的結果的本機快取) 則可能會改變結果。BENCHMARK() 的使用因此會透過更重視執行階段元件,並移除網路、剖析器、最佳化工具等引入的雜訊來測量執行階段元件的效能。

  • CHARSET(str)

    傳回字串引數的字元集,如果引數為 NULL,則傳回 NULL

    mysql> SELECT CHARSET('abc');
            -> 'utf8mb3'
    mysql> SELECT CHARSET(CONVERT('abc' USING latin1));
            -> 'latin1'
    mysql> SELECT CHARSET(USER());
            -> 'utf8mb3'
  • COERCIBILITY(str)

    傳回字串引數的校對強制性值。

    mysql> SELECT COERCIBILITY('abc' COLLATE utf8mb4_swedish_ci);
            -> 0
    mysql> SELECT COERCIBILITY(USER());
            -> 3
    mysql> SELECT COERCIBILITY('abc');
            -> 4
    mysql> SELECT COERCIBILITY(1000);
            -> 5

    傳回值具有下表中顯示的意義。較低的值具有較高的優先順序。

    強制性 意義 範例
    0 明確校對 具有 COLLATE 子句的值
    1 無校對 具有不同校對的字串串連
    2 隱含校對 資料行值、預存程序參數或區域變數
    3 系統常數 USER() 傳回值
    4 可強制 常值字串
    5 數值 數值或時間值
    6 可忽略 NULL 或衍生自 NULL 的運算式

    如需更多資訊,請參閱章節 12.8.4,「運算式中的校對強制性」

  • COLLATION(str)

    傳回字串引數的校對。

    mysql> SELECT COLLATION('abc');
            -> 'utf8mb4_0900_ai_ci'
    mysql> SELECT COLLATION(_utf8mb4'abc');
            -> 'utf8mb4_0900_ai_ci'
    mysql> SELECT COLLATION(_latin1'abc');
            -> 'latin1_swedish_ci'
  • CONNECTION_ID()

    傳回連線的連線 ID (執行緒 ID)。每個連線都有一個 ID,該 ID 在目前已連線的用戶端集中是唯一的。

    CONNECTION_ID() 傳回的值,與資訊綱要 (PROCESSLIST) 資料表中 ID 欄位、SHOW PROCESSLIST 輸出的 Id 欄位,以及效能綱要 (threads) 資料表的 PROCESSLIST_ID 欄位中顯示的值類型相同。

    mysql> SELECT CONNECTION_ID();
            -> 23786
    警告

    變更系統變數 pseudo_thread_id 的會期值,會變更 CONNECTION_ID() 函式傳回的值。

  • CURRENT_ROLE()

    傳回一個包含目前會期啟用角色的 utf8mb3 字串,角色之間以逗號分隔,如果沒有啟用角色,則傳回 NONE。此值反映了系統變數 sql_quote_show_create 的設定。

    假設帳戶的角色授予如下:

    GRANT 'r1', 'r2' TO 'u1'@'localhost';
    SET DEFAULT ROLE ALL TO 'u1'@'localhost';

    u1 的會期中,初始的 CURRENT_ROLE() 值會命名預設的帳戶角色。使用 SET ROLE 會變更此值。

    mysql> SELECT CURRENT_ROLE();
    +-------------------+
    | CURRENT_ROLE()    |
    +-------------------+
    | `r1`@`%`,`r2`@`%` |
    +-------------------+
    mysql> SET ROLE 'r1'; SELECT CURRENT_ROLE();
    +----------------+
    | CURRENT_ROLE() |
    +----------------+
    | `r1`@`%`       |
    +----------------+
  • CURRENT_USERCURRENT_USER()

    傳回伺服器用來驗證目前用戶端的 MySQL 帳戶的使用者名稱和主機名稱組合。此帳戶決定您的存取權限。傳回值是 utf8mb3 字元集中的字串。

    CURRENT_USER() 的值可能與 USER() 的值不同。

    mysql> SELECT USER();
            -> 'davida@localhost'
    mysql> SELECT * FROM mysql.user;
    ERROR 1044: Access denied for user ''@'localhost' to
    database 'mysql'
    mysql> SELECT CURRENT_USER();
            -> '@localhost'

    此範例說明,雖然用戶端指定的使用者名稱是 davida(如 USER() 函式的值所示),但伺服器使用匿名使用者帳戶驗證了該用戶端(如 CURRENT_USER() 值的空使用者名稱部分所示)。發生這種情況的一種原因是,在 davida 的授權表中沒有列出任何帳戶。

    在儲存的程式或檢視表中,CURRENT_USER() 會傳回定義物件的使用者帳戶(如其 DEFINER 值所給定的),除非使用 SQL SECURITY INVOKER 特性定義。在後一種情況下,CURRENT_USER() 會傳回物件的調用者。

    觸發程序和事件沒有定義 SQL SECURITY 特性的選項,因此對於這些物件,CURRENT_USER() 會傳回定義物件的使用者帳戶。若要傳回調用者,請使用 USER()SESSION_USER()

    以下陳述式支援使用 CURRENT_USER() 函式來取代受影響的使用者或定義者的名稱(以及可能的主機);在這種情況下,CURRENT_USER() 會在需要時展開。

    有關 CURRENT_USER() 的這種展開對複寫的影響的相關資訊,請參閱 第 19.5.1.8 節,「CURRENT_USER() 的複寫」

    此函式可用於 VARCHARTEXT 欄位的預設值,如下面的 CREATE TABLE 陳述式所示:

    CREATE TABLE t (c VARCHAR(288) DEFAULT (CURRENT_USER()));
  • DATABASE()

    utf8mb3 字元集中的字串形式傳回預設 (目前) 資料庫名稱。如果沒有預設資料庫,DATABASE() 會傳回 NULL。在儲存的常式中,預設資料庫是常式相關聯的資料庫,這不一定與呼叫內容中的預設資料庫相同。

    mysql> SELECT DATABASE();
            -> 'test'

    如果沒有預設資料庫,DATABASE() 會傳回 NULL

  • FOUND_ROWS()

    注意

    已棄用 SQL_CALC_FOUND_ROWS 查詢修飾詞和隨附的 FOUND_ROWS() 函式;預計會在未來版本的 MySQL 中移除它們。執行帶有 LIMIT 的查詢,然後執行第二個帶有 COUNT(*) 且不帶 LIMIT 的查詢,以判斷是否有其他資料列。例如,而不是這些查詢:

    SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE id > 100 LIMIT 10;
    SELECT FOUND_ROWS();

    改用這些查詢:

    SELECT * FROM tbl_name WHERE id > 100 LIMIT 10;
    SELECT COUNT(*) FROM tbl_name WHERE id > 100;

    COUNT(*) 受某些最佳化影響。SQL_CALC_FOUND_ROWS 會導致某些最佳化被停用。

    SELECT 陳述式可能包含 LIMIT 子句,以限制伺服器傳回給用戶端的資料列數。在某些情況下,需要知道如果沒有 LIMIT,陳述式會傳回多少資料列,但不必再次執行該陳述式。若要取得此資料列計數,請在 SELECT 陳述式中包含 SQL_CALC_FOUND_ROWS 選項,然後隨後調用 FOUND_ROWS()

    mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name
        -> WHERE id > 100 LIMIT 10;
    mysql> SELECT FOUND_ROWS();

    第二個 SELECT 傳回一個數字,指示如果第一個 SELECT 是在沒有 LIMIT 子句的情況下撰寫的,它將會傳回多少資料列。

    如果最近成功的 SELECT 陳述式中沒有 SQL_CALC_FOUND_ROWS 選項,則 FOUND_ROWS() 會傳回該陳述式傳回的結果集中的資料列數。如果該陳述式包含 LIMIT 子句,則 FOUND_ROWS() 會傳回直到限制的資料列數。例如,如果陳述式包含 LIMIT 10LIMIT 50, 10,則 FOUND_ROWS() 分別傳回 10 或 60。

    透過 FOUND_ROWS() 取得的資料列計數是暫時性的,並且不應在 SELECT SQL_CALC_FOUND_ROWS 陳述式之後的陳述式中使用。如果您需要在稍後參考該值,請儲存它。

    mysql> SELECT SQL_CALC_FOUND_ROWS * FROM ... ;
    mysql> SET @rows = FOUND_ROWS();

    如果您正在使用 SELECT SQL_CALC_FOUND_ROWS,則 MySQL 必須計算完整結果集中有多少資料列。但是,這比再次執行不帶 LIMIT 的查詢更快,因為結果集不需要傳送給用戶端。

    當您想要限制查詢傳回的資料列數,但也想確定完整結果集中的資料列數而不必再次執行查詢時,SQL_CALC_FOUND_ROWSFOUND_ROWS() 會非常有用。一個範例是 Web 腳本,該腳本呈現一個分頁顯示,其中包含指向顯示搜尋結果其他部分的頁面的連結。使用 FOUND_ROWS() 可以讓您確定結果的其餘部分需要多少其他頁面。

    對於 UNION 陳述式,SQL_CALC_FOUND_ROWSFOUND_ROWS() 的使用比簡單的 SELECT 陳述式更複雜,因為 LIMIT 可能會出現在 UNION 中的多個位置。它可以應用於 UNION 中的個別 SELECT 陳述式,或是全域套用於整個 UNION 結果。

    UNIONSQL_CALC_FOUND_ROWS 的意圖是,它應傳回沒有全域 LIMIT 的情況下會傳回的資料列計數。將 SQL_CALC_FOUND_ROWSUNION 一起使用的條件是:

    • SQL_CALC_FOUND_ROWS 關鍵字必須出現在 UNION 的第一個 SELECT 中。

    • 只有在使用 UNION ALL 的情況下,FOUND_ROWS() 的值才是精確的。如果使用沒有 ALLUNION,則會進行重複項移除,而 FOUND_ROWS() 的值僅為近似值。

    • 如果 UNION 中沒有 LIMIT,則會忽略 SQL_CALC_FOUND_ROWS,並傳回用於處理 UNION 而建立的暫存表中的列數。

    除了此處描述的情況之外,FOUND_ROWS() 的行為是未定義的(例如,在 SELECT 陳述式失敗並出現錯誤後,它的值)。

    重要

    使用基於陳述式的複製時,FOUND_ROWS() 無法可靠地複製。此函數會自動使用基於列的複製進行複製。

  • ICU_VERSION()

    用於支援正規表示式操作的 Unicode 國際組件 (ICU) 程式庫的版本(請參閱章節 14.8.2,「正規表示式」)。此函數主要用於測試案例中。

  • LAST_INSERT_ID(), LAST_INSERT_ID(expr)

    在沒有引數的情況下,LAST_INSERT_ID() 會傳回一個 BIGINT UNSIGNED (64 位元) 值,表示最近執行的 INSERT 陳述式成功插入的 AUTO_INCREMENT 欄位的第一個自動產生值。如果沒有成功插入任何列,LAST_INSERT_ID() 的值會保持不變。

    帶有引數的 LAST_INSERT_ID() 會傳回一個不帶正負號的整數,如果引數為 NULL,則傳回 NULL

    例如,在插入產生 AUTO_INCREMENT 值的列之後,您可以像這樣取得該值

    mysql> SELECT LAST_INSERT_ID();
            -> 195

    目前執行的陳述式不會影響 LAST_INSERT_ID() 的值。假設您使用一個陳述式產生 AUTO_INCREMENT 值,然後在多列 INSERT 陳述式中參照 LAST_INSERT_ID(),該陳述式會將列插入到具有自己的 AUTO_INCREMENT 欄位的表格中。在第二個陳述式中,LAST_INSERT_ID() 的值會保持穩定;其針對第二列和後續列的值不會受到先前列插入的影響。(您應該注意,如果您混用對 LAST_INSERT_ID()LAST_INSERT_ID(expr) 的參照,則效果是未定義的。)

    如果先前的陳述式傳回錯誤,則 LAST_INSERT_ID() 的值是未定義的。對於交易式表格,如果陳述式因錯誤而回溯,則 LAST_INSERT_ID() 的值會保持未定義。對於手動 ROLLBACKLAST_INSERT_ID() 的值不會還原為交易前的狀態;它會保持在 ROLLBACK 時的值。

    在預存常式(程序或函數)或觸發器的主體中,LAST_INSERT_ID() 的值變更方式與在這些物件的主體外部執行的陳述式相同。預存常式或觸發器對後續陳述式所看到的 LAST_INSERT_ID() 值之影響取決於常式的類型

    • 如果預存程序執行會變更 LAST_INSERT_ID() 值的陳述式,則後續程序呼叫的陳述式會看到變更後的值。

    • 對於會變更該值的預存函數和觸發器,當函數或觸發器結束時,該值會還原,因此後續的陳述式不會看到變更後的值。

    在伺服器上,產生的 ID 會以每個連線為基礎維護。這表示函數傳回給指定用戶端的值是由該用戶端影響 AUTO_INCREMENT 欄位的最近陳述式所產生的第一個 AUTO_INCREMENT 值。此值不會受到其他用戶端的影響,即使他們產生自己的 AUTO_INCREMENT 值也是如此。此行為可確保每個用戶端都可以擷取自己的 ID,而不必擔心其他用戶端的活動,也不需要鎖定或交易。

    如果您將列的 AUTO_INCREMENT 欄位設定為非magic值(也就是,非 NULL 且非 0 的值),則 LAST_INSERT_ID() 的值不會變更。

    重要

    如果您使用單一 INSERT 陳述式插入多列,LAST_INSERT_ID() 只會傳回為第一個插入列產生的值。原因是為了能夠輕鬆地在其他伺服器上重製相同的 INSERT 陳述式。

    例如

    mysql> USE test;
    
    mysql> CREATE TABLE t (
           id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
           name VARCHAR(10) NOT NULL
           );
    
    mysql> INSERT INTO t VALUES (NULL, 'Bob');
    
    mysql> SELECT * FROM t;
    +----+------+
    | id | name |
    +----+------+
    |  1 | Bob  |
    +----+------+
    
    mysql> SELECT LAST_INSERT_ID();
    +------------------+
    | LAST_INSERT_ID() |
    +------------------+
    |                1 |
    +------------------+
    
    mysql> INSERT INTO t VALUES
           (NULL, 'Mary'), (NULL, 'Jane'), (NULL, 'Lisa');
    
    mysql> SELECT * FROM t;
    +----+------+
    | id | name |
    +----+------+
    |  1 | Bob  |
    |  2 | Mary |
    |  3 | Jane |
    |  4 | Lisa |
    +----+------+
    
    mysql> SELECT LAST_INSERT_ID();
    +------------------+
    | LAST_INSERT_ID() |
    +------------------+
    |                2 |
    +------------------+

    雖然第二個 INSERT 陳述式將三個新列插入到 t 中,但為這些列的第一列產生的 ID 是 2,而 LAST_INSERT_ID() 針對下列 SELECT 陳述式傳回的值就是這個值。

    如果您使用 INSERT IGNORE 並且忽略該列,則 LAST_INSERT_ID() 會保持目前的數值不變(如果連線尚未執行成功的 INSERT,則傳回 0),而且對於非交易式表格,AUTO_INCREMENT 計數器不會遞增。對於 InnoDB 表格,如果 innodb_autoinc_lock_mode 設定為 12,則會遞增 AUTO_INCREMENT 計數器,如下列範例所示

    mysql> USE test;
    
    mysql> SELECT @@innodb_autoinc_lock_mode;
    +----------------------------+
    | @@innodb_autoinc_lock_mode |
    +----------------------------+
    |                          1 |
    +----------------------------+
    
    mysql> CREATE TABLE `t` (
           `id` INT(11) NOT NULL AUTO_INCREMENT,
           `val` INT(11) DEFAULT NULL,
           PRIMARY KEY (`id`),
           UNIQUE KEY `i1` (`val`)
           ) ENGINE=InnoDB;
    
    # Insert two rows
    
    mysql> INSERT INTO t (val) VALUES (1),(2);
    
    # With auto_increment_offset=1, the inserted rows
    # result in an AUTO_INCREMENT value of 3
    
    mysql> SHOW CREATE TABLE t\G
    *************************** 1. row ***************************
           Table: t
    Create Table: CREATE TABLE `t` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `val` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `i1` (`val`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
    
    # LAST_INSERT_ID() returns the first automatically generated
    # value that is successfully inserted for the AUTO_INCREMENT column
    
    mysql> SELECT LAST_INSERT_ID();
    +------------------+
    | LAST_INSERT_ID() |
    +------------------+
    |                1 |
    +------------------+
    
    # The attempted insertion of duplicate rows fail but errors are ignored
    
    mysql> INSERT IGNORE INTO t (val) VALUES (1),(2);
    Query OK, 0 rows affected (0.00 sec)
    Records: 2  Duplicates: 2  Warnings: 0
    
    # With innodb_autoinc_lock_mode=1, the AUTO_INCREMENT counter
    # is incremented for the ignored rows
    
    mysql> SHOW CREATE TABLE t\G
    *************************** 1. row ***************************
           Table: t
    Create Table: CREATE TABLE `t` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `val` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `i1` (`val`)
    ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
    
    # The LAST_INSERT_ID is unchanged because the previous insert was unsuccessful
    
    mysql> SELECT LAST_INSERT_ID();
    +------------------+
    | LAST_INSERT_ID() |
    +------------------+
    |                1 |
    +------------------+

    如需詳細資訊,請參閱章節 17.6.1.6,「InnoDB 中的 AUTO_INCREMENT 處理」

    如果將 expr 作為 LAST_INSERT_ID() 的引數,則該函數會傳回引數的值,並且會記住此值,以便作為 LAST_INSERT_ID() 下次要傳回的值。這可用於模擬序列

    1. 建立表格以保留序列計數器並進行初始化

      mysql> CREATE TABLE sequence (id INT NOT NULL);
      mysql> INSERT INTO sequence VALUES (0);
    2. 使用該表格產生類似這樣的序號

      mysql> UPDATE sequence SET id=LAST_INSERT_ID(id+1);
      mysql> SELECT LAST_INSERT_ID();

      UPDATE 陳述式會遞增序列計數器,並導致下次呼叫 LAST_INSERT_ID() 時傳回更新後的值。SELECT 陳述式會擷取該值。C API 函數 mysql_insert_id() 也可用於取得值。請參閱mysql_insert_id()

    您可以在不呼叫 LAST_INSERT_ID() 的情況下產生序列,但是以這種方式使用該函數的實用之處在於,ID 值會在伺服器中維護為最後一個自動產生值。由於多個用戶端可以發出 UPDATE 陳述式,並透過 SELECT 陳述式(或 mysql_insert_id())取得自己的序列值,而不會影響或受到其他產生自己序列值的用戶端的影響,因此這對多用戶端而言是安全的。

    請注意,只有在 INSERTUPDATE 陳述式之後,才會更新 mysql_insert_id(),因此在執行 SELECTSET 等其他 SQL 陳述式之後,您無法使用 C API 函數擷取 LAST_INSERT_ID(expr) 的值。

  • ROLES_GRAPHML()

    傳回一個包含表示記憶體角色子圖的 GraphML 文件之 utf8mb3 字串。需要 ROLE_ADMIN 權限(或已淘汰的 SUPER 權限)才能查看 <graphml> 元素中的內容。否則,結果只會顯示空的元素

    mysql> SELECT ROLES_GRAPHML();
    +---------------------------------------------------+
    | ROLES_GRAPHML()                                   |
    +---------------------------------------------------+
    | <?xml version="1.0" encoding="UTF-8"?><graphml /> |
    +---------------------------------------------------+
  • ROW_COUNT()

    ROW_COUNT() 傳回的值如下

    • DDL 陳述式:0。這適用於諸如 CREATE TABLEDROP TABLE 之類的陳述式。

    • SELECT 之外的 DML 陳述式:受影響的列數。這適用於諸如 UPDATEINSERTDELETE 之類的陳述式(如同先前),但現在也適用於諸如 ALTER TABLELOAD DATA 之類的陳述式。

    • SELECT:如果陳述式傳回結果集,則為 -1;如果沒有,則為「受影響」的列數。例如,對於 SELECT * FROM t1ROW_COUNT() 傳回 -1。對於 SELECT * FROM t1 INTO OUTFILE 'file_name'ROW_COUNT() 傳回寫入檔案的列數。

    • SIGNAL 陳述式:0。

    對於 UPDATE 陳述式,預設的受影響列數值是實際變更的列數。如果您在連線到 mysqld 時,將 CLIENT_FOUND_ROWS 旗標指定給 mysql_real_connect(),則受影響的列數值是「找到」的列數;也就是說,符合 WHERE 子句的列數。

    對於 REPLACE 陳述式,如果新列取代了舊列,則受影響的列數值為 2,因為在這種情況下,刪除重複項後會插入一列。

    對於 INSERT ... ON DUPLICATE KEY UPDATE 陳述式,如果該列是作為新列插入,則每列受影響的列數值為 1;如果更新現有列,則為 2;如果將現有列設定為其目前的值,則為 0。如果您指定 CLIENT_FOUND_ROWS 旗標,如果將現有列設定為其目前的值,則受影響的列數值為 1(而不是 0)。

    ROW_COUNT() 的值類似於 mysql_affected_rows() C API 函數的值,以及 mysql 用戶端在陳述式執行後顯示的列數。

    mysql> INSERT INTO t VALUES(1),(2),(3);
    Query OK, 3 rows affected (0.00 sec)
    Records: 3  Duplicates: 0  Warnings: 0
    
    mysql> SELECT ROW_COUNT();
    +-------------+
    | ROW_COUNT() |
    +-------------+
    |           3 |
    +-------------+
    1 row in set (0.00 sec)
    
    mysql> DELETE FROM t WHERE i IN(1,2);
    Query OK, 2 rows affected (0.00 sec)
    
    mysql> SELECT ROW_COUNT();
    +-------------+
    | ROW_COUNT() |
    +-------------+
    |           2 |
    +-------------+
    1 row in set (0.00 sec)
    重要

    使用基於陳述式的複製時,無法可靠地複製 ROW_COUNT()。此函數會使用基於列的複製自動複製。

  • SCHEMA()

    此函數是 DATABASE() 的同義詞。

  • SESSION_USER()

    SESSION_USER()USER() 的同義詞。

    USER() 一樣,此函數可以用於 VARCHARTEXT 資料行的預設值,如下列 CREATE TABLE 陳述式所示

    CREATE TABLE t (c VARCHAR(288) DEFAULT (SESSION_USER()));
  • SYSTEM_USER()

    SYSTEM_USER()USER() 的同義詞。

    注意

    SYSTEM_USER() 函數與 SYSTEM_USER 權限不同。前者會傳回目前的 MySQL 帳戶名稱。後者會區分系統使用者和一般使用者帳戶類別(請參閱第 8.2.11 節「帳戶類別」)。

    USER() 一樣,此函數可以用於 VARCHARTEXT 資料行的預設值,如下列 CREATE TABLE 陳述式所示

    CREATE TABLE t (c VARCHAR(288) DEFAULT (SYSTEM_USER()));
  • USER()

    utf8mb3 字元集傳回目前 MySQL 使用者名稱和主機名稱的字串。

    mysql> SELECT USER();
            -> 'davida@localhost'

    該值會指出您在連線至伺服器時指定的使用者名稱,以及您連線的用戶端主機。該值可能與 CURRENT_USER() 的值不同。

    此函式可用於 VARCHARTEXT 欄位的預設值,如下面的 CREATE TABLE 陳述式所示:

    CREATE TABLE t (c VARCHAR(288) DEFAULT (USER()));
  • VERSION()

    傳回表示 MySQL 伺服器版本的字串。該字串使用 utf8mb3 字元集。除了版本號碼之外,該值可能還有後綴。請參閱第 7.1.8 節「伺服器系統變數」中的 version 系統變數說明。

    此函數對於基於陳述式的複製是不安全的。如果當 binlog_format 設定為 STATEMENT 時使用此函數,則會記錄警告。

    mysql> SELECT VERSION();
            -> '8.4.0-standard'