文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
信息 (Gzip) - 4.0Mb
信息 (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。

    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 结果。

    SQL_CALC_FOUND_ROWS 用于 UNION 的目的是返回在没有全局 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 值,然后在将行插入到具有其自身 AUTO_INCREMENT 列的表中的多行 INSERT 语句中引用了 LAST_INSERT_ID()。在第二个语句中,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 语句检索该值。mysql_insert_id() C API 函数也可用于获取该值。请参阅 mysql_insert_id()

    您可以生成序列而不调用 LAST_INSERT_ID(),但是以这种方式使用该函数的实用之处在于,ID 值在服务器中作为最后自动生成的值维护。它是多用户安全的,因为多个客户端可以发出 UPDATE 语句并使用 SELECT 语句(或 mysql_insert_id())获取自己的序列值,而不会影响或被生成自己序列值的 other 客户端所影响。

    请注意,mysql_insert_id() 仅在 INSERTUPDATE 语句之后更新,因此您不能在执行其他 SQL 语句(如 SELECTSET)之后使用 C API 函数检索 LAST_INSERT_ID(expr) 的值。

  • ROLES_GRAPHML()

    返回一个包含表示内存角色子图的 GraphML 文档的 utf8mb3 字符串。查看 <graphml> 元素中的内容需要 ROLE_ADMIN 权限(或已弃用的 SUPER 权限)。否则,结果将仅显示一个空元素

    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 时为 mysql_real_connect() 指定了 CLIENT_FOUND_ROWS 标志,则受影响的行数值是“找到的”行数;也就是说,与 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'