SQL语句最可见的部分是语句的文本。从MySQL 8.0.23开始,客户端还可以定义适用于下一个发送到服务器执行的语句的查询属性:
属性是在发送语句之前定义的。
直到语句执行结束,属性才会存在,此时属性集将被清除。
当属性存在时,可以在服务器端访问它们。
查询属性的方法示例:
web应用程序生成生成数据库查询的页面,并且对于每个查询必须跟踪生成它的页面的URL。
应用程序在每次查询时都传递额外的处理信息,以供插件使用,例如审计插件或查询重写插件。
MySQL支持这些功能,而不需要使用诸如查询字符串中包含的特殊格式化注释之类的变通方法。本节的其余部分描述如何使用查询属性支持,包括必须满足的先决条件。
使用MySQL C API的应用程序通过调用mysql_bind_param ()
函数。看到mysql_bind_param ().其他MySQL连接器也可能提供查询属性支持。请参阅有关个别连10bet官方网站接器的文档。
的mysql客户端有一个query_attributes
允许定义最多32对属性名称和值的命令。看到章节4.5.1.2,“mysql客户端命令”.
属性所指示的字符集来传输查询属性名character_set_client
系统变量。
要在已为其定义属性的SQL语句中访问查询属性,请安装query_attributes
组件,详见使用查询属性的前提条件.组件实现了mysql_query_attribute_string ()
接受属性名参数并以字符串形式返回属性值的用户定义函数(UDF)零
如果属性不存在。看到第5.7.3节“查询属性自定义函数”.
下面的示例使用mysql客户端query_attributes
命令来定义属性名称/值对,以及mysql_query_attribute_string ()
UDF通过名称访问属性值。
此示例定义了两个名为n1
而且n2
.第一个选择
演示如何检索这些属性,并演示检索不存在的属性(n3
)返回零
.第二个选择
显示属性不跨语句持久存在。
Mysql > query_attributes n1 v1 n2 v2;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 >选择mysql_query_attribute_string (n1) attr 1, mysql_query_attribute_string (n2)“attr 2”;+--------+--------+ | attr 1 | attr 2 | +--------+--------+ | 零|零 | +--------+--------+
如第二条所示选择
语句中,在给定语句之前定义的属性仅对该语句可用,并在语句执行后清除。若要跨多个语句使用属性值,请将其分配给一个变量。下面的示例演示了如何做到这一点,并说明了属性值可以通过变量在后续语句中使用,而不是通过调用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零| | v2 | NULL | +--------+--------+--------+--------+
属性也可以通过存储在表中来保存以供以后使用:
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'));SELECT * FROM t1;+------+------+ | c1 | c2 | +------+------+ | v1 | v2 | +------+------+
查询属性受以下限制和限制:
如果在将一条语句发送到服务器执行之前发生多个属性定义操作,则最近的定义操作应用并替换早期操作中定义的属性。
如果用相同的名称定义了多个属性,则检索属性值的尝试将得到未定义的结果。
用空名称定义的属性不能按名称检索。
属性对于用其准备的语句不可用
准备
.的
mysql_query_attribute_string ()
UDF不能在DDL语句中使用。属性不会被复制。调用
mysql_query_attribute_string ()
UDF不会在所有服务器上获得相同的值。
要访问已为其定义属性的SQL语句中的查询属性,可以使用query_attributes
必须安装组件。用下面的语句来表达:
安装组件”文件:/ / component_query_attributes”;
组件安装是一次性操作,不需要在每次服务器启动时进行。安装组件
加载该组件,并将其注册到10bet靠谱mysql.component
系统表,以便在后续服务器启动期间加载它。
的query_attributes
组件访问查询属性来实现mysql_query_attribute_string ()
UDF。看到第5.5.4节“查询属性组件”.
卸载了query_attributes
组件,使用以下语句:
卸载组件“文件:/ / component_query_attributes”;
卸载组件
卸载该组件,并从10bet靠谱mysql.component
系统表,以导致在后续服务器启动期间不加载它。
因为安装和卸载query_attributes
组件将安装和卸载mysql_query_attribute_string ()
组件实现的函数,不需要使用创建函数
或删除函数
这样做。