27.7.4 C API 数据结构

本节介绍了用于准备语句的 C API 数据结构以外的其他数据结构。有关后者的信息,请参见第 27.7.8 节“ C API 准备的语句数据结构”

  • MYSQL

此结构 table 示一个数据库连接的处理程序。它几乎用于所有 MySQL 函数。不要尝试制作MYSQL结构的副本。不能保证这样的副本将可用。

  • MYSQL_RES

此结构 table 示返回行(SELECTSHOWDESCRIBEEXPLAIN)的查询结果。从查询返回的信息在本节的其余部分称为“结果集”。

  • MYSQL_ROW

这是一行数据的类型安全 table 示。当前,它被实现为一个计数字节字符串数组。 (如果字段值可能包含二进制数据,则不能将它们视为以 null 终止的字符串,因为此类值内部可能包含 null 字节.)通过调用mysql_fetch_row()获得行。

  • MYSQL_FIELD

该结构包含元数据:有关字段的信息,例如字段的名称,类型和大小。本节稍后将更详细地描述其成员。您可以通过重复调用mysql_fetch_field()获得每个字段的MYSQL_FIELD结构。字段值不属于此结构;它们包含在MYSQL_ROW结构中。

  • MYSQL_FIELD_OFFSET

这是 MySQL 字段列 table 中偏移量的类型安全 table 示。 (由mysql_field_seek()使用。)偏移量是一行中的字段编号,从零开始。

  • my_ulonglong

用于行数以及mysql_affected_rows()mysql_num_rows()mysql_insert_id()的类型。此类型提供01.84e19的范围。

某些使用此类型返回行计数的函数将-1 返回为无符号值,以指示错误或异常情况。您可以通过将返回值与(my_ulonglong)-1(或与(my_ulonglong)~0进行比较)来检查-1.

在某些系统上,尝试打印my_ulonglong类型的值不起作用。要打印此值,请将其转换为unsigned long并使用%lu打印格式。例:

printf ("Number of rows: %lu\n",
        (unsigned long) mysql_num_rows(result));
  • my_bool

布尔类型,其值为 true(非零)或 false(零)。

MYSQL_FIELD结构包含以下列 table 中描述的成员。定义主要适用于结果集的列,例如SELECT语句产生的列。 MYSQL_FIELD结构还用于为从使用准备好的CALL语句执行的存储过程返回的OUTINOUT参数提供元数据。对于此类参数,某些结构成员的含义不同于列值的含义。

  • char * name

字段名称,以空值结尾的字符串。如果为字段提供了带有AS子句的别名,则name的值为别名。对于过程参数,为参数名称。

  • char * org_name

字段名称,以空值结尾的字符串。别名将被忽略。对于 table 达式,该值为空字符串。对于过程参数,为参数名称。

  • char * table

包含此字段的 table 的名称(如果它不是计算字段)。对于计算的字段,table值为空字符串。如果从视图中选择该列,则table命名视图。如果为 table 或视图提供了带有AS子句的别名,则table的值为别名。对于UNION,该值为空字符串。对于过程参数,为过程名称。

  • char * org_table

table 的名称,以空值结尾的字符串。别名将被忽略。如果从视图中选择了该列,则org_table命名该视图。如果从派生 table 中选择该列,则org_table命名基 table。如果派生 table 包装了视图,则org_table仍将命名基 table。如果列是 table 达式,则org_table是空字符串。对于UNION,该值为空字符串。对于过程参数,该值为过程名称。

  • char * db

字段来源的数据库的名称,以空值结尾的字符串。如果该字段是计算字段,则db是空字符串。对于UNION,该值为空字符串。对于过程参数,是包含该过程的数据库的名称。

  • char * catalog

目录名称。此值始终为"def"

  • char * def

此字段的默认值,以空值结尾的字符串。仅当您使用mysql_list_fields()时才设置。

  • unsigned long length

字段的宽度。这对应于显示长度(以字节为单位)。

服务器在生成结果集之前确定length值,因此这是能够保留结果列中最大可能值的数据类型所需的最小长度,而无需事先知道查询将产生的实际值结果集。

  • unsigned long max_length

结果集的字段的最大宽度(结果集中实际行的最长字段值的长度,以字节为单位)。如果使用mysql_store_result()mysql_list_fields(),则该字段包含该字段的最大长度。如果使用mysql_use_result(),则此变量的值为零。

max_length是结果集中值的字符串 table 示形式的长度。例如,如果检索FLOAT列且“最宽”值为-12.345,则max_length为 7(长度为'-12.345')。

如果使用预处理语句,则默认情况下不会设置max_length,因为对于二进制协议,值的长度取决于结果集中值的类型。 (请参阅第 27.7.8 节“ C API 准备的语句数据结构”。)如果仍然需要max_length值,请使用mysql_stmt_attr_set()启用STMT_ATTR_UPDATE_MAX_LENGTH选项,并且在调用mysql_stmt_store_result()时将设置长度。 (请参见第 27.7.10.3 节“ mysql_stmt_attr_set()”第 27.7.10.28 节,“ mysql_stmt_store_result()”。)

  • unsigned int name_length

name的长度。

  • unsigned int org_name_length

org_name的长度。

  • unsigned int table_length

table的长度。

  • unsigned int org_table_length

org_table的长度。

  • unsigned int db_length

db的长度。

  • unsigned int catalog_length

catalog的长度。

  • unsigned int def_length

def的长度。

  • unsigned int flags

描述该字段的位标志。 flags值可能具有零个或多个下 table 中所示的位。

Flag ValueFlag Description
NOT_NULL_FLAG栏位不能为NULL
PRI_KEY_FLAG字段是主键的一部分
UNIQUE_KEY_FLAG字段是唯一键的一部分
MULTIPLE_KEY_FLAG字段是非唯一键的一部分
UNSIGNED_FLAG字段具有UNSIGNED属性
ZEROFILL_FLAG字段具有ZEROFILL属性
BINARY_FLAG字段具有BINARY属性
AUTO_INCREMENT_FLAG字段具有AUTO_INCREMENT属性
ENUM_FLAG字段是ENUM
SET_FLAG栏位为SET
BLOB_FLAG字段是BLOBTEXT(已弃用)
TIMESTAMP_FLAG字段是TIMESTAMP(已弃用)
NUM_FLAG字段为数字;参见下 table 中的其他 Comments
NO_DEFAULT_VALUE_FLAG字段没有默认值;参见下 table 中的其他 Comments

这些标志中的一些标志指示数据类型信息,并被稍后描述的field->type成员中的MYSQL_TYPE_xxx值取代或与其结合使用:

  • 要检查BLOBTIMESTAMP值,请检查typeMYSQL_TYPE_BLOB还是MYSQL_TYPE_TIMESTAMP。 (不需要BLOB_FLAGTIMESTAMP_FLAG标志.)

    • ENUMSET值作为字符串返回。对于这些,请检查type的值是否为MYSQL_TYPE_STRING,并且在flags的值中设置了ENUM_FLAGSET_FLAG标志。

NUM_FLAGtable 示一列是数字。这包括类型为MYSQL_TYPE_DECIMALMYSQL_TYPE_NEWDECIMALMYSQL_TYPE_TINYMYSQL_TYPE_SHORTMYSQL_TYPE_LONGMYSQL_TYPE_FLOATMYSQL_TYPE_DOUBLEMYSQL_TYPE_NULLMYSQL_TYPE_LONGLONGMYSQL_TYPE_INT24MYSQL_TYPE_YEAR的列。

NO_DEFAULT_VALUE_FLAGtable 示列的定义中没有DEFAULT子句。这不适用于NULL列(因为此类列的默认值为NULL)或AUTO_INCREMENT列(具有默示的默认值)。

以下示例说明了flags值的典型用法:

if (field->flags & NOT_NULL_FLAG)
    printf("Field cannot be null\n");

您可以使用下 table 中显示的便捷宏来确定flags值的布尔状态。

Flag StatusDescription
IS_NOT_NULL(flags)如果此字段定义为NOT NULL,则为 True
IS_PRI_KEY(flags)如果此字段是主键,则为 True
IS_BLOB(flags)如果此字段是BLOBTEXT(不建议使用;请测试field->type),则为 True
  • unsigned int decimals

数字字段的小数位数,以及时间字段的小数秒精度。

  • unsigned int charsetnr

指示该字段的字符集/排序规则对的 ID 号。

通常,结果集中的字符值将转换为character_set_results系统变量指示的字符集。在这种情况下,charsetnr对应于该变量指示的字符集。通过将character_set_results设置为NULL可以抑制字符集转换。在这种情况下,charsetnr对应于原始 table 列或 table 达式的字符集。另请参见第 10.4 节“连接字符集和排序规则”

要区分字符串数据类型的二进制数据和非二进制数据,请检查charsetnr的值是否为 63.如果是,则字符集为binary,它 table 示二进制而不是非二进制数据。这使您能够区分BINARYCHARVARBINARYVARCHAR以及BLOBTEXT类型。

charsetnr的值与SHOW COLLATION语句的Id列或INFORMATION_SCHEMA COLLATIONStable 的ID列中显示的值相同。您可以使用这些信息源来查看哪些字符集和排序规则特定的charsetnr值指示:

mysql> SHOW COLLATION WHERE Id = 63;
+-----------+---------+----+---------+----------+---------+
| Collation | Charset | Id | Default | Compiled | Sortlen |
+-----------+---------+----+---------+----------+---------+
| binary    | binary  | 63 | Yes     | Yes      |       1 |
+-----------+---------+----+---------+----------+---------+

mysql> SELECT COLLATION_NAME, CHARACTER_SET_NAME
       FROM INFORMATION_SCHEMA.COLLATIONS WHERE ID = 33;
+-----------------+--------------------+
| COLLATION_NAME  | CHARACTER_SET_NAME |
+-----------------+--------------------+
| utf8_general_ci | utf8               |
+-----------------+--------------------+
  • enum enum_field_types type

字段的类型。 type值可以是下 table 中显示的MYSQL_TYPE_符号之一。

Type ValueType Description
MYSQL_TYPE_TINYTINYINT field
MYSQL_TYPE_SHORTSMALLINT field
MYSQL_TYPE_LONGINTEGER field
MYSQL_TYPE_INT24MEDIUMINT field
MYSQL_TYPE_LONGLONGBIGINT field
MYSQL_TYPE_DECIMALDECIMALNUMERIC字段
MYSQL_TYPE_NEWDECIMAL精确 mathDECIMALNUMERIC
MYSQL_TYPE_FLOATFLOAT field
MYSQL_TYPE_DOUBLEDOUBLEREAL字段
MYSQL_TYPE_BITBIT field
MYSQL_TYPE_TIMESTAMPTIMESTAMP field
MYSQL_TYPE_DATEDATE field
MYSQL_TYPE_TIMETIME field
MYSQL_TYPE_DATETIMEDATETIME field
MYSQL_TYPE_YEARYEAR field
MYSQL_TYPE_STRINGCHARBINARY字段
MYSQL_TYPE_VAR_STRINGVARCHARVARBINARY字段
MYSQL_TYPE_BLOBBLOBTEXT字段(使用max_length确定最大长度)
MYSQL_TYPE_SETSET field
MYSQL_TYPE_ENUMENUM field
MYSQL_TYPE_GEOMETRYSpatial field
MYSQL_TYPE_NULLNULL类型字段

MYSQL_TYPE_TIME2MYSQL_TYPE_DATETIME2MYSQL_TYPE_TIMESTAMP2)类型代码仅在服务器端使用。Client 端看到MYSQL_TYPE_TIMEMYSQL_TYPE_DATETIMEMYSQL_TYPE_TIMESTAMP代码。

您可以使用IS_NUM()宏来测试字段是否具有数字类型。将type值传递给IS_NUM(),如果该字段为数字,则其值为 TRUE:

if (IS_NUM(field->type))
    printf("Field is numeric\n");

ENUMSET值作为字符串返回。对于这些,请检查type的值是否为MYSQL_TYPE_STRING,并且在flags的值中设置了ENUM_FLAGSET_FLAG标志。