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


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

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() 傳回的值,與 Information Schema PROCESSLIST 表格的 ID 欄位、SHOW PROCESSLIST 輸出的 Id 欄位,以及 Performance Schema 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_USER, CURRENT_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 的帳戶。

    在預存程式或檢視中,除非定義了 SQL SECURITY INVOKER 特性,否則 CURRENT_USER() 會傳回定義物件的使用者帳戶(由其 DEFINER 值給定)。在後一種情況下,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, 10FOUND_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,而後續 SELECT 陳述式所傳回的 LAST_INSERT_ID() 就是這個值。

    如果您使用 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 陳述式會擷取該值。mysql_insert_id() C API 函式也可用於取得該值。請參閱 mysql_insert_id()

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

    請注意,只有在 INSERTUPDATE 陳述式之後才會更新 mysql_insert_id(),因此您無法在執行其他 SQL 陳述式(例如 SELECTSET)之後,使用 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();
            -> '9.0.0-standard'