表 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()函数重复执行表达式- 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()通过赋予运行时组件更多权重并消除网络、解析器、优化器等引入的““噪音” 来测量其性能。
 
- 返回字符串参数的字符集,如果参数为 - NULL则返回- NULL。- mysql> SELECT CHARSET('abc'); -> 'utf8mb3' mysql> SELECT CHARSET(CONVERT('abc' USING latin1)); -> 'latin1' mysql> SELECT CHARSET(USER()); -> 'utf8mb3'
- 返回字符串参数的排序规则强制性值。 - 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 节“表达式中的排序规则强制性”。 
- 返回字符串参数的排序规则。 - 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'
- 返回连接的连接 ID(线程 ID)。每个连接都有一个在当前连接的客户端集合中唯一的 ID。 - CONNECTION_ID()返回的值与信息模式- PROCESSLIST表的- ID列、- SHOW PROCESSLIST输出的- Id列以及性能模式- threads表的- PROCESSLIST_ID列中显示的值类型相同。- mysql> SELECT CONNECTION_ID(); -> 23786警告- 更改 - pseudo_thread_id系统变量的会话值会更改- CONNECTION_ID()函数返回的值。
- 返回一个 - 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`@`%` | +----------------+
- 返回服务器用于验证当前客户端的 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() 的复制”。- 此函数可以用于 - VARCHAR或- TEXT列的默认值,如以下- CREATE TABLE语句所示- CREATE TABLE t (c VARCHAR(288) DEFAULT (CURRENT_USER()));
- 以 - utf8mb3字符集中的字符串形式返回默认(当前)数据库名称。如果没有默认数据库,则- DATABASE()返回- NULL。在存储例程中,默认数据库是例程关联的数据库,它不一定是调用上下文中默认的数据库。- mysql> SELECT DATABASE(); -> 'test'- 如果没有默认数据库,则 - DATABASE()返回- NULL。
- 
注意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 10或LIMIT 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_ROWS和FOUND_ROWS()非常有用。例如,一个 Web 脚本呈现一个分页显示,其中包含指向显示搜索结果其他部分的页面的链接。使用FOUND_ROWS()可以确定其余结果还需要多少页。对于 UNION语句,SQL_CALC_FOUND_ROWS和FOUND_ROWS()的使用比简单的SELECT语句更复杂,因为LIMIT可能会出现在UNION中的多个位置。它可以应用于UNION中的单个SELECT语句,也可以全局应用于整个UNION结果。SQL_CALC_FOUND_ROWS用于UNION的目的是返回在没有全局LIMIT的情况下将返回的行计数。将SQL_CALC_FOUND_ROWS与UNION一起使用的条件是- 只有在使用 - UNION ALL时,- FOUND_ROWS()的值才是精确的。如果使用不带- ALL的- UNION,则会进行重复数据删除,并且- FOUND_ROWS()的值只是一个近似值。
- 如果 - UNION中不存在- LIMIT,则将忽略- SQL_CALC_FOUND_ROWS,并返回为处理- UNION而创建的临时表中的行数。
 除了此处描述的情况外, FOUND_ROWS()的行为是未定义的(例如,在因错误而失败的SELECT语句之后的值)。重要使用基于语句的复制无法可靠地复制 FOUND_ROWS()。使用基于行的复制自动复制此函数。
- 用于支持正则表达式操作的国际 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()的值将保持未定义状态。对于手动- ROLLBACK,- LAST_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设置为- 1或- 2,则- 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()下次返回的值。这可以用于模拟序列- 创建一个表来保存序列计数器并对其进行初始化 - 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())获取自己的序列值,而不会影响或被生成自己序列值的 other 客户端所影响。- 请注意, - mysql_insert_id()仅在- INSERT和- UPDATE语句之后更新,因此您不能在执行其他 SQL 语句(如- SELECT或- SET)之后使用 C API 函数检索- LAST_INSERT_ID(的值。- expr)
- 返回一个包含表示内存角色子图的 GraphML 文档的 - utf8mb3字符串。查看- <graphml>元素中的内容需要- ROLE_ADMIN权限(或已弃用的- SUPER权限)。否则,结果将仅显示一个空元素- mysql> SELECT ROLES_GRAPHML(); +---------------------------------------------------+ | ROLES_GRAPHML() | +---------------------------------------------------+ | <?xml version="1.0" encoding="UTF-8"?><graphml /> | +---------------------------------------------------+
- ROW_COUNT()返回如下值- DDL 语句:0。这适用于诸如 - CREATE TABLE或- DROP TABLE之类的语句。
- SELECT以外的 DML 语句:受影响的行数。这适用于诸如- 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 时为- 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()。使用基于行的复制会自动复制此函数。
- 此函数是 - DATABASE()的同义词。
- SESSION_USER()是- USER()的同义词。- 与 - USER()一样,此函数可用于- VARCHAR或- TEXT列的默认值,如以下- CREATE TABLE语句所示- CREATE TABLE t (c VARCHAR(288) DEFAULT (SESSION_USER()));
- SYSTEM_USER()是- USER()的同义词。注意- SYSTEM_USER()函数与- SYSTEM_USER权限不同。前者返回当前 MySQL 帐户名称。后者区分系统用户和普通用户帐户类别(请参阅第 8.2.11 节 “帐户类别”)。- 与 - USER()一样,此函数可用于- VARCHAR或- TEXT列的默认值,如以下- CREATE TABLE语句所示- CREATE TABLE t (c VARCHAR(288) DEFAULT (SYSTEM_USER()));
- 以 - utf8mb3字符集的字符串形式返回当前 MySQL 用户名和主机名。- mysql> SELECT USER(); -> 'davida@localhost'- 该值指示您在连接到服务器时指定的用户名称,以及您连接自的客户端主机。该值可能与 - CURRENT_USER()的值不同。- 此函数可以用于 - VARCHAR或- TEXT列的默认值,如以下- CREATE TABLE语句所示- CREATE TABLE t (c VARCHAR(288) DEFAULT (USER()));
- 返回一个指示 MySQL 服务器版本的字符串。该字符串使用 - utf8mb3字符集。除了版本号之外,该值可能还有一个后缀。请参阅第 7.1.8 节 “服务器系统变量”中对- version系统变量的描述。- 对于基于语句的复制,此函数是不安全的。如果在 - binlog_format设置为- STATEMENT时使用此函数,则会记录警告。- mysql> SELECT VERSION(); -> '8.4.0-standard'