信息函数
信息函数
| 名称 | 描述 | 
|---|---|
| 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()用于测量标量表达式的运行时性能,这对使用它和解释结果的方式有一些重要影响:- 只能使用标量表达式。尽管表达式可以是子查询,但它必须返回单列和最多单行。例如,BENCHMARK(10,(SELECT * FROM t))如果表t具有多于一列或多于一行,将失败。
- 执行语句的时间与所执行的开销量不同。两者的执行配置文件非常不同,您不应期望它们花费相同的时间。前者涉及解析器,优化器,表锁定和运行时评估时间。后者仅涉及运行时评估SELECT exprNSELECT BENCHMARK(N,expr)NN时间,而所有其他组件仅一次。已经分配的内存结构将被重用,并且运行时优化(例如已针对聚合函数评估的结果的本地缓存)可能会更改结果。BENCHMARK()因此,通过使用,可以通过赋予该组件更多的权重并消除网络,解析器,优化器等引入的“噪音”来衡量该组件的性能。
 
- 只能使用标量表达式。尽管表达式可以是子查询,但它必须返回单列和最多单行。例如,
- CHARSET(str)- 返回字符串参数的字符集。 - mysql> - SELECT CHARSET('abc'); -> 'utf8' mysql>- SELECT CHARSET(CONVERT('abc'- USING latin1)); -> 'latin1' mysql>- SELECT CHARSET(USER()); -> 'utf8'
- COERCIBILITY(str)- 返回字符串参数的校验规则强制性值。 - mysql> - SELECT COERCIBILITY('abc'- COLLATE utf8_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- 数字 - 数值或时间值 - 5- 无知的 - NULL或源自的表达式- NULL- 有关更多信息,请参见“表达式中的校验规则强制性”。 
- COLLATION(str)- 返回字符串参数的校验规则。 - mysql> - SELECT COLLATION('abc'); -> 'utf8_general_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()的值- ID与- INFORMATION_SCHEMA.PROCESSLIST表的- Id列,- SHOW PROCESSLIST输出的- PROCESSLIST_ID列和“性能模式”- threads表的列中显示的值类型相同。- mysql> - SELECT CONNECTION_ID(); -> 23786
- CURRENT_ROLE()- 返回一个 - utf8字符串,其中包含当前会话的当前活动角色,以逗号分隔,或者- 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帐户的用户名和主机名组合。该帐户确定您的访问权限。返回值是 - utf8字符集中的字符串。- 值 - 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()将在需要的地方进行扩展:- DROP USER
- RENAME USER
- GRANT
- REVOKE
- CREATE FUNCTION
- CREATE PROCEDURE
- CREATE TRIGGER
- CREATE EVENT
- CREATE VIEW
- ALTER EVENT
- ALTER VIEW
- SET PASSWORD
 - 有关此扩展 - CURRENT_USER()对复制的影响的信息,请参见“ CURRENT_USER()的复制”。
- DATABASE()- 以 - utf8字符集的字符串形式返回默认(当前)数据库名称。如果没有默认数据库,则- DATABASE()返回- NULL。在存储的例程中,默认数据库是与该例程关联的数据库,它不一定与调用上下文中的默认数据库相同。- mysql> - SELECT DATABASE(); -> 'test'- 如果没有默认数据库,则 - DATABASE()返回- NULL。
- FOUND_ROWS()- 注意 - 从 MySQL 8.0.17开始不赞成使用 - 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,而无需再次运行该语句。要获得此行数,请- SQL_CALC_FOUND_ROWS在- SELECT语句中包括一个选项,然后再调用- FOUND_ROWS():- mysql> - SELECT - SQL_CALC_FOUND_ROWS *- FROM tbl_name ->- WHERE id > 100- LIMIT 10; mysql>- SELECT FOUND_ROWS();- 第二个 - SELECT返回一个数字,表示如果- SELECT不使用该- LIMIT子句编写第一个,则第一个将返回多少行。- 如果 - SQL_CALC_FOUND_ROWS最近的成功- SELECT语句中没有该选项,则- FOUND_ROWS()返回该语句返回的结果集中的行数。如果该语句包含一个- LIMIT子句,则- FOUND_ROWS()返回最大行数。例如,- FOUND_ROWS()如果语句包含- LIMIT 10或,则分别返回10或60- LIMIT 50, 10。- 可用的行计数 - 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_ROWS并且- FOUND_ROWS()在您希望限制查询返回的行数但又可以确定整个结果集中的行数而无需再次运行查询的情况下很有用。一个示例是一个Web脚本,它显示一个页面显示,其中包含指向显示搜索结果其他部分的页面的链接。使用- FOUND_ROWS()使您可以确定结果的其余部分还需要多少其他页面。- 语句的使用 - SQL_CALC_FOUND_ROWS和比简单语句- FOUND_ROWS()更复杂,因为它可能在中的多个位置发生。它可以应用于中的单个语句,也可以应用于整个结果的全局语句。- UNION- SELECT- LIMIT- UNION- SELECT- UNION- UNION- SQL_CALC_FOUND_ROWSfor 的意图- UNION是,它应返回不带global的行数- LIMIT。使用- SQL_CALC_FOUND_ROWSwith 的条件- UNION是:- 该SQL_CALC_FOUND_ROWS关键字必须出现在第一个SELECT的UNION。
- FOUND_ROWS()仅当- UNION ALL使用时,值才是精确的。如果使用- UNION不- ALL使用,将发生重复删除,并且的值- FOUND_ROWS()仅是近似值。
- 如果没有LIMIT出现在UNION,SQL_CALC_FOUND_ROWS被忽略,返回所创建以处理在临时表中的行数UNION。
 - 除了此处描述的情况外,的行为 - FOUND_ROWS()是不确定的(例如,- SELECT在出现错误的语句失败后其值)。- 重要 - FOUND_ROWS()使用基于语句的复制无法可靠地复制。使用基于行的复制会自动复制此功能。
- 该
- ICU_VERSION()- Unicode国际组件(ICU)库的版本用于支持正则表达式操作(请参见“MySQL正则表达式函数”)。此功能主要用于测试用例。 
- LAST_INSERT_ID(),- LAST_INSERT_ID(expr)- 不带任何参数的情况下, - LAST_INSERT_ID()将返回- BIGINT UNSIGNED(64位)值,该值表示- AUTO_INCREMENT由于最近执行的- INSERT语句而成功为列成功插入的第一个自动生成的值。- LAST_INSERT_ID()如果没有成功插入任何行,则的值保持不变。- 带参数 - LAST_INSERT_ID()返回无符号整数。- 例如,在插入生成 - AUTO_INCREMENT值的行之后,您可以像这样获得值:- mysql> - SELECT LAST_INSERT_ID(); -> 195- 当前正在执行的语句不会影响的值 - LAST_INSERT_ID()。假设您- AUTO_INCREMENT使用一个语句生成一个值,然后- LAST_INSERT_ID()在多行- INSERT语句中引用该语句,该语句将行插入具有自己- AUTO_INCREMENT列的表中。- LAST_INSERT_ID()在第二个语句中,值将保持稳定;第二行和第二行的值不受先前行插入的影响。(但是,如果混合使用对- LAST_INSERT_ID()和的引用,则效果是不确定的。)- LAST_INSERT_ID(expr)- 如果前一条语句返回错误,则的值 - LAST_INSERT_ID()未定义。对于事务表,如果由于错误而回滚了该语句,- LAST_INSERT_ID()则未定义的值。对于manual- ROLLBACK,的值- LAST_INSERT_ID()不会恢复为交易之前的值;它仍然像当时一样- ROLLBACK。- 在存储的例程(过程或函数)或触发器 - LAST_INSERT_ID()的主体内,更改的值与在此类对象的主体外部执行的语句相同。- LAST_INSERT_ID()通过以下语句可以看到存储的例程或触发器对其值的影响,取决于例程的类型:- 如果存储过程执行的语句更改了的值LAST_INSERT_ID(),则该过程调用后的语句将看到更改的值。
- 对于存储的函数和更改该值的触发器,该函数或触发器结束时将恢复该值,因此以下语句将看不到更改后的值。
 - 生成的ID在每个连接的服务器中维护。这意味着函数返回给定客户端的 - AUTO_INCREMENT值是为该客户端影响- AUTO_INCREMENT列的最新语句生成的第一个值。该值不会受到其他客户端的影响,即使它们生成- AUTO_INCREMENT自己的值也是如此。此行为可确保每个客户端都可以检索自己的ID,而不必担心其他客户端的活动,也不需要锁或事务。- LAST_INSERT_ID()如果将- AUTO_INCREMENT行的列设置为非“ magic ”值(即,not- NULL和not 的值),则不会更改的值- 0。- 重要 - 如果您将使用一个多行 - 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()当前值保持不变(如果连接尚未成功执行,则返回0- INSERT),并且对于非事务处理表,该- AUTO_INCREMENT计数器不会增加。对于- InnoDB表,- AUTO_INCREMENT如果将计数器- innodb_autoinc_lock_mode设置为- 1或- 2,则该计数器递增,如以下示例所示:- 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- DEFAULT - CHARSET =latin1; # 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=latin1 # 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=latin1 # The LAST_INSERT_ID is unchanged because the previous insert was unsuccessful mysql>- SELECT LAST_INSERT_ID(); +------------------ + | LAST_INSERT_ID() | +------------------ + | 1 | +------------------ +- 有关更多信息,请参见“ InnoDB中的AUTO_INCREMENT处理”。 - 如果 - expr将用作参数- LAST_INSERT_ID(),则该参数的值由函数返回,并记住为的下一个值- LAST_INSERT_ID()。这可以用来模拟序列:- 创建一个表来保存序列计数器并对其进行初始化: - mysql> - CREATE - TABLE sequence (id INT NOT NULL); mysql>- INSERT - INTO sequence- VALUES (0);
- 使用该表生成如下的序列号: - 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())获取自己的序列值,而不会影响或受到生成自己的序列值的其他客户端的影响。- 请注意, - mysql_insert_id()仅在- INSERT和- UPDATE语句之后更新,因此在执行其他SQL语句(例如或)后,不能使用C API函数来检索其值。- LAST_INSERT_ID(expr)- SELECT- SET
- 如果存储过程执行的语句更改了的值
- ROLES_GRAPHML()- 返回 - utf8包含表示内存角色子图的GraphML文档的字符串。必须具有- ROLE_ADMINor- SUPER特权才能参见- <graphml>元素中的内容。否则,结果仅显示一个空元素:- mysql> - SELECT ROLES_GRAPHML(); +--------------------------------------------------- + | ROLES_GRAPHML() | +--------------------------------------------------- + | <?xml version="1.0" encoding="UTF -8"?><graphml /> | +--------------------------------------------------- +
- ROW_COUNT()- ROW_COUNT()返回一个值,如下所示:- DDL语句:0。这适用于诸如CREATE TABLE或的语句DROP TABLE。
- DML语句除外SELECT:受影响的行数。这适用于报表等UPDATE,INSERT或DELETE(如前),但现在还声明,如ALTER TABLE和LOAD DATA。
- SELECT:如果语句返回结果集,则为-1,否则返回“受影响”的行数。例如,对于- SELECT * FROM t1,- ROW_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()使用基于语句的复制无法可靠地复制。使用基于行的复制会自动复制此功能。
- DDL语句:0。这适用于诸如
- SCHEMA()- 此功能是的同义词 - DATABASE()。
- SESSION_USER()- SESSION_USER()是的同义词- USER()。
- SYSTEM_USER()- SYSTEM_USER()是的同义词- USER()。- 注意 - 该 - SYSTEM_USER()功能与- SYSTEM_USER特权不同。前者返回当前的MySQL帐户名。后者区分系统用户帐户和常规用户帐户类别(请参见“帐户类别”)。
- USER()- 以 - utf8字符集的字符串形式返回当前的MySQL用户名和主机名。- mysql> - SELECT USER(); -> 'davida@localhost'- 该值指示您在连接到服务器时指定的用户名以及从中连接的客户端主机。该值可以与的值不同 - CURRENT_USER()。
- VERSION()- 返回指示MySQL服务器版本的字符串。字符串使用 - utf8字符集。该值除版本号外还可以带有后缀。请参见“服务器系统变量”中对- version系统变量的描述。- 此功能对于基于语句的复制不安全。设置为时,如果使用此功能, - binlog_format将记录警告- STATEMENT。- mysql> - SELECT VERSION(); -> '8.0.21-standard'
