SQL 语句最明显的部分是语句的文本。从 MySQL 8.0.23 开始,客户端还可以定义适用于发送到服务器执行的下一条语句的查询属性:
- 在发送语句之前定义属性。
- 属性存在直到语句执行结束,此时属性集被清除。
- 虽然存在属性,但可以在服务器端访问它们。
可以使用查询属性的方式示例:
- Web 应用程序生成生成数据库查询的页面,并且对于每个查询必须跟踪生成它的页面的 URL。
- 应用程序为每个查询传递额外的处理信息,以供诸如审计插件或查询重写插件之类的插件使用。
MySQL 支持这些功能而无需使用变通方法,例如查询字符串中包含的特殊格式的注释。本节的其余部分描述如何使用查询属性支持,包括必须满足的先决条件。
定义和访问查询属性
使用 MySQL C API 的应用程序通过调用mysql_bind_param() 函数来定义查询属性。请参阅mysql_bind_param()。其他 MySQL 连接器也可能提供查询属性支持。请参阅各个连接器的文档。
的MySQL的客户端具有 query_attributes使得能够限定高达32对属性名和值的命令。见 第 4.5.1.2 节,“mysql 客户端命令”。
使用character_set_client系统变量指示的字符集传输查询属性名称 。
要访问已为其定义属性的 SQL 语句中的查询属性,请按照使用查询属性的先决条件中的说明安装该 query_attributes组件 。该组件实现了一个 可加载函数,该函数接受一个属性名称参数并将属性值作为字符串返回,或者 如果该属性不存在。请参阅 查询属性可加载函数。 mysql_query_attribute_string()NULL
以下示例使用mysql客户端 query_attributes命令来定义属性名称/值对,以及mysql_query_attribute_string() 通过名称访问属性值的 函数。
此示例定义了两个名为n1 和 的属性n2。第一个SELECT 展示了如何检索这些属性,还演示了检索不存在的属性 ( n3) 会返回NULL. 第二个 SELECT显示属性不会跨语句持续存在。
mysql> query_attributes n1 v1 n2 v2;
mysql> SELECT
mysql_query_attribute_string('n1') AS 'attr 1',
mysql_query_attribute_string('n2') AS 'attr 2',
mysql_query_attribute_string('n3') AS 'attr 3';
+--------+--------+--------+
| attr 1 | attr 2 | attr 3 |
+--------+--------+--------+
| v1 | v2 | NULL |
+--------+--------+--------+
mysql> SELECT
mysql_query_attribute_string('n1') AS 'attr 1',
mysql_query_attribute_string('n2') AS 'attr 2';
+--------+--------+
| attr 1 | attr 2 |
+--------+--------+
| NULL | NULL |
+--------+--------+
如第二个SELECT语句所示,在给定语句之前定义的属性仅可用于该语句,并在语句执行后清除。要在多个语句中使用一个属性值,请将其分配给一个变量。以下示例显示了如何执行此操作,并说明在后续语句中可通过变量使用属性值,但不能通过调用 mysql_query_attribute_string():
mysql> query_attributes n1 v1 n2 v2;
mysql> SET
@attr1 = mysql_query_attribute_string('n1'),
@attr2 = mysql_query_attribute_string('n2');
mysql> SELECT
@attr1, mysql_query_attribute_string('n1') AS 'attr 1',
@attr2, mysql_query_attribute_string('n2') AS 'attr 2';
+--------+--------+--------+--------+
| @attr1 | attr 1 | @attr2 | attr 2 |
+--------+--------+--------+--------+
| v1 | NULL | v2 | NULL |
+--------+--------+--------+--------+
也可以通过将属性存储在表中来保存属性以供以后使用:
mysql> CREATE TABLE t1 (c1 CHAR(20), c2 CHAR(20));
mysql> query_attributes n1 v1 n2 v2;
mysql> INSERT INTO t1 (c1, c2) VALUES(
mysql_query_attribute_string('n1'),
mysql_query_attribute_string('n2')
);
mysql> SELECT * FROM t1;
+------+------+
| c1 | c2 |
+------+------+
| v1 | v2 |
+------+------+
查询属性受以下限制和约束:
- 如果在将语句发送到服务器执行之前发生了多个属性定义操作,则最近的定义操作会应用并替换先前操作中定义的属性。
- 如果使用相同名称定义了多个属性,则尝试检索属性值会产生未定义的结果。
- 不能通过名称检索使用空名称定义的属性。
- 属性不可用于使用 准备的语句
PREPARE。 - 该
mysql_query_attribute_string()函数不能在 DDL 语句中使用。 - 不会复制属性。调用该
mysql_query_attribute_string()函数的语句 不会在所有服务器上获得相同的值。
使用查询属性的先决条件
要访问已为其定义属性的 SQL 语句中的查询属性,query_attributes必须安装该 组件。使用以下语句执行此操作:
INSTALL COMPONENT "file://component_query_attributes";
组件安装是一次性操作,不需要在每次服务器启动时完成。INSTALL COMPONENT加载组件,并将其注册到mysql.component系统表中以使其在后续服务器启动期间加载。
该query_attributes组件访问查询属性以实现 mysql_query_attribute_string() 功能。请参阅第 5.5.4 节,“查询属性组件”。
要卸载query_attributes组件,请使用以下语句:
UNINSTALL COMPONENT "file://component_query_attributes";
UNINSTALL COMPONENT卸载组件,并将其从mysql.component系统表中注销, 以使其在后续服务器启动期间不被加载。
因为安装和卸载 query_attributes组件是安装和卸载该mysql_query_attribute_string() 组件实现的 功能,所以没有必要使用CREATE FUNCTION或 DROP FUNCTION 这样做。
查询属性可加载函数
-
mysql_query_attribute_string(*name*)应用程序可以定义应用于发送到服务器的下一个查询的属性。该
mysql_query_attribute_string()函数从 MySQL 8.0.23 开始可用,在给定属性名称的情况下,将属性值作为字符串返回。此功能使查询能够访问和合并适用于它的属性值。mysql_query_attribute_string()通过安装query_attributes组件来安装 。请参阅 第 9.6 节,“查询属性”,其中还讨论了查询属性的目的和使用。参数:
name: 属性名称。
返回值:
返回属性值作为成功的字符串,或者
NULL如果属性不存在。例子:
以下示例使用mysql 客户端
query_attributes命令来定义可由mysql_query_attribute_string(). 的SELECT显示,检索不存在的属性(n3)返回NULL。mysql> query_attributes n1 v1 n2 v2; mysql> SELECT -> mysql_query_attribute_string('n1') AS 'attr 1', -> mysql_query_attribute_string('n2') AS 'attr 2', -> mysql_query_attribute_string('n3') AS 'attr 3'; +--------+--------+--------+ | attr 1 | attr 2 | attr 3 | +--------+--------+--------+ | v1 | v2 | NULL | +--------+--------+--------+




