SQL 陳述式最明顯的部分是陳述式的文字。用戶端還可以定義查詢屬性,這些屬性會應用於傳送至伺服器執行之下的陳述式。
屬性在傳送陳述式之前定義。
屬性存在直到陳述式執行結束,此時屬性集會被清除。
當屬性存在時,可以在伺服器端存取。
查詢屬性可能使用方式的範例
Web 應用程式產生會產生資料庫查詢的頁面,而且每個查詢都必須追蹤產生它的頁面 URL。
應用程式會隨每個查詢傳遞額外的處理資訊,以供稽核外掛程式或查詢重寫外掛程式等外掛程式使用。
MySQL 支援這些功能,而無需使用諸如包含在查詢字串中的特殊格式化註解等因應措施。本節的其餘部分將說明如何使用查詢屬性支援,包括必須滿足的先決條件。
使用 MySQL C API 的應用程式會透過呼叫 mysql_bind_param()
函式來定義查詢屬性。請參閱 mysql_bind_param()。其他 MySQL 連接器也可能提供查詢屬性支援。請參閱個別連接器的文件。
mysql 用戶端具有 query_attributes
命令,可讓您定義最多 32 組屬性名稱和值。請參閱 第 6.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()
函式。請參閱 第 7.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_query_attribute_string()
是透過安裝query_attributes
元件來安裝的。請參閱第 11.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 | +--------+--------+--------+