3.6.7 可选结果集元数据

当客户端执行产生结果集的语句时,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_FULLRESULTSET_METADATA_NONE 以分别指示结果集具有完整元数据或没有元数据。

mysql_result_metadata() 在客户端事先不知道结果集是否有元数据的情况下很有用。 例如,如果客户端执行返回多个结果集并且可能会更改 resultset_metadata 系统变量的存储过程,则客户端可以为每个结果集调用 mysql_result_metadata() 以确定它是否具有元数据。