当客户端执行生成结果集的语句时,MySQL 会提供结果集中包含的数据,默认情况下还会提供结果集元数据,这些元数据提供有关结果集数据的相关信息。元数据包含在 MYSQL_FIELD
结构中(请参见 第 5.2 节,“C API 基本数据结构”),这些结构由 mysql_fetch_field()
、mysql_fetch_field_direct()
和 mysql_fetch_fields()
函数返回。
客户端可以在每个连接的基础上指示结果集元数据是可选的,并且客户端将指示服务器是否返回它。客户端抑制元数据传输可以提高性能,特别是对于执行许多每次仅返回几行的查询的会话而言。
客户端可以通过两种方式指示结果集元数据对于连接是可选的。这两种方式是等效的,因此任一方式都足够。
在连接时间之前,为
mysql_options()
启用MYSQL_OPT_OPTIONAL_RESULTSET_METADATA
选项。在连接时,为
mysql_real_connect()
的client_flag
参数启用CLIENT_OPTIONAL_RESULTSET_METADATA
标志。
对于元数据可选连接,客户端设置 resultset_metadata
系统变量来控制服务器是否返回结果集元数据。允许的值为 FULL
(返回所有元数据)和 NONE
(不返回任何元数据)。默认值为 FULL
,因此即使对于元数据可选连接,服务器默认情况下也会返回元数据。
对于元数据可选连接,当 resultset_metadata
设置为 NONE
时,mysql_fetch_field()
、mysql_fetch_field_direct()
和 mysql_fetch_fields()
函数将返回 NULL
。
对于不是元数据可选的连接,将 resultset_metadata
设置为 NONE
会产生错误。
要检查结果集是否具有元数据,客户端可以调用 mysql_result_metadata()
函数。此函数返回 RESULTSET_METADATA_FULL
或 RESULTSET_METADATA_NONE
,分别指示结果集具有完整元数据或无元数据。
mysql_result_metadata()
在客户端不知道结果集是否事先具有元数据时非常有用。例如,如果客户端执行返回多个结果集并可能更改 resultset_metadata
系统变量的存储过程,则客户端可以为每个结果集调用 mysql_result_metadata()
来确定它是否具有元数据。