文档首页
MySQL 8.4 C API 开发者指南
下载本手册
PDF (US Ltr) - 1.4Mb
PDF (A4) - 1.4Mb


MySQL 8.4 C API 开发者指南  /  C API 基本接口  /  C API 基本数据结构

5.2 C API 基本数据结构

本节介绍 C API 数据结构,但不包括用于预处理语句、异步接口或复制流接口的结构。有关这些内容的信息,请参阅第 6.2 节,“C API 预处理语句数据结构”第 7.2 节,“C API 异步接口数据结构”第 10.2 节,“C API 二进制日志数据结构”

  • MYSQL

    此结构表示一个数据库连接的句柄。它几乎用于所有 MySQL 函数。请勿尝试复制 MYSQL 结构。不能保证此类副本可用。

  • MYSQL_RES

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

  • MYSQL_ROW

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

  • MYSQL_FIELD

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

  • MYSQL_FIELD_OFFSET

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

  • my_ulonglong

    用于 64 位无符号整数的类型。my_ulonglong 类型在 MySQL 8.0.18 之前使用。从 MySQL 8.0.18 开始,请改用 uint64_t C 类型。

  • my_bool

    布尔类型,用于值为真(非零)或假(零)。my_bool 类型在 MySQL 8.0 之前使用。从 MySQL 8.0 开始,请改用 boolint C 类型。

    注意

    my_boolbool 的更改意味着 mysql.h 头文件需要 C++ 或 C99 编译器才能编译。

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

提示

要以交互方式查看结果集的 MYSQL_FIELD 成员值,请使用 --column-type-info 选项启动 mysql 客户端,然后执行一些示例查询。

  • char * name

    字段的名称,作为以 null 结尾的字符串。如果使用 AS 子句为该字段指定了别名,则 name 的值为该别名。对于过程参数,为参数名称。

  • char * org_name

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

  • char * table

    包含此字段的表的名称,如果它不是计算字段。对于计算字段,table 值为空字符串。如果该列是从视图中选择的,则 table 为视图的名称。如果使用 AS 子句为表或视图指定了别名,则 table 的值为该别名。对于 UNION,该值为空字符串。对于过程参数,为过程名称。

  • char * org_table

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

  • char * db

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

  • char * catalog

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

  • char * def

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

  • unsigned long length

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

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

    对于字符串列,length 值取决于连接字符集。例如,如果字符集为 latin1(一种单字节字符集),则 SELECT 'abc' 查询的 length 值为 3。如果字符集为 utf8mb4(一种多字节字符集,其中字符最多占用 4 个字节),则 length 值为 12。

  • unsigned long max_length

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

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

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

  • 无符号整数 name_length

    name 的长度。

  • 无符号整数 org_name_length

    org_name 的长度。

  • 无符号整数 table_length

    table 的长度。

  • 无符号整数 org_table_length

    org_table 的长度。

  • 无符号整数 db_length

    db 的长度。

  • 无符号整数 catalog_length

    catalog 的长度。

  • 无符号整数 def_length

    def 的长度。

  • 无符号整数 flags

    描述字段的位标志。 flags 值可以设置下表中显示的一个或多个位。

    标志值 标志说明
    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 字段是数字;请参阅下表中的附加说明
    NO_DEFAULT_VALUE_FLAG 字段没有默认值;请参阅下表中的附加说明

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

    • 要检查 BLOBTIMESTAMP 值,请检查 type 是否为 MYSQL_TYPE_BLOBMYSQL_TYPE_TIMESTAMP。(不需要 BLOB_FLAGTIMESTAMP_FLAG 标志。)

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

    NUM_FLAG 指示列是数字。这包括类型为 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_FLAG 指示列在其定义中没有 DEFAULT 子句。这不适用于 NULL 列(因为此类列的默认值为 NULL)或 AUTO_INCREMENT 列(它们具有隐式默认值)。

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

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

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

    标志状态 说明
    IS_NOT_NULL(flags) 如果此字段定义为 NOT NULL 则为真
    IS_PRI_KEY(flags) 如果此字段是主键,则为真
    IS_BLOB(flags) 如果此字段是 BLOBTEXT,则为真(已弃用;请改用 field->type 进行测试)
  • 无符号整数 decimals

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

  • 无符号整数 charsetnr

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

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

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

    charsetnr 值与 SHOW COLLATION 语句的 Id 列或 INFORMATION_SCHEMA COLLATIONS 表的 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_field_types 类型

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

    类型值 类型说明
    MYSQL_TYPE_TINY TINYINT 字段
    MYSQL_TYPE_SHORT SMALLINT 字段
    MYSQL_TYPE_LONG INTEGER 字段
    MYSQL_TYPE_INT24 MEDIUMINT 字段
    MYSQL_TYPE_LONGLONG BIGINT 字段
    MYSQL_TYPE_DECIMAL DECIMALNUMERIC 字段
    MYSQL_TYPE_NEWDECIMAL 精确数学 DECIMALNUMERIC
    MYSQL_TYPE_FLOAT FLOAT 字段
    MYSQL_TYPE_DOUBLE DOUBLEREAL 字段
    MYSQL_TYPE_BIT BIT 字段
    MYSQL_TYPE_TIMESTAMP TIMESTAMP 字段
    MYSQL_TYPE_DATE DATE 字段
    MYSQL_TYPE_TIME TIME 字段
    MYSQL_TYPE_DATETIME DATETIME 字段
    MYSQL_TYPE_YEAR YEAR 字段
    MYSQL_TYPE_STRING CHARBINARY 字段
    MYSQL_TYPE_VAR_STRING VARCHARVARBINARY 字段
    MYSQL_TYPE_BLOB BLOBTEXT 字段(使用 max_length 确定最大长度)
    MYSQL_TYPE_SET SET 字段
    MYSQL_TYPE_ENUM ENUM 字段
    MYSQL_TYPE_GEOMETRY 空间字段
    MYSQL_TYPE_NULL NULL 类型字段

    MYSQL_TYPE_TIME2MYSQL_TYPE_DATETIME2MYSQL_TYPE_TIMESTAMP2)类型代码仅在服务器端使用。客户端看到的是 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 标志。