10bet网址
MySQL 5.7 C API开发指南
本手册下载
PDF (Ltr)- 1.1 mb
PDF (A4)- 1.1 mb
HTML下载(TGZ)- 147.1 kb
HTML下载(邮政编码)- 156.8 kb


5.2 C API基本数据结构

本节描述了C API数据结构,而不是用于预处理语句的数据结构。有关后者的信息,请参见第6.2节,“C API准备好的语句数据结构”

  • MYSQL

    这个结构表示一个数据库连接的处理程序。几乎所有的MySQL函数都使用它。不要试图复制一份MYSQL结构。不能保证这样的副本是可用的。

  • MYSQL_RES

    此结构表示返回行的查询结果(选择显示描述解释).从查询返回的信息称为结果集在本节的其余部分中。

  • MYSQL_ROW

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

  • MYSQL_FIELD

    这个结构包含元数据:关于字段的信息,例如字段的名称、类型和大小。本节稍后将更详细地描述其成员。你可取得MYSQL_FIELD为每个字段调用作用()反复。字段值不是这个结构的一部分;它们包含在MYSQL_ROW结构。

  • MYSQL_FIELD_OFFSET

    这是MySQL字段列表中偏移量的类型安全表示。(用mysql_field_seek ().)偏移量是行中从0开始的字段数。

  • my_ulonglong

    用于行数和的类型mysql_affected_rows ()mysql_num_rows (),mysql_insert_id ().此类型提供一个范围01.84 e19

    一些使用这种类型返回行数的函数将-1作为无符号值返回,以表示错误或异常情况。您可以通过比较返回值来检查-1(my_ulonglong) 1(或(my_ulonglong) ~ 0,两者是等价的)。

    在某些系统上,试图打印type值my_ulonglong不工作。要打印这样的值,请将其转换为无符号长和使用陆%打印格式。例子:

    printf("行数:%lu\n", (unsigned long) mysql_num_rows(result));
  • my_bool

    一种布尔类型,值为真(非零)或假(零)。

MYSQL_FIELD结构包含以下列表中描述的成员。这些定义主要适用于结果集的列,例如由选择语句。MYSQL_FIELD结构还用于提供元数据INOUT从使用准备好的存储过程执行的存储过程返回的参数调用语句。对于这些参数,一些结构成员的含义与列值的含义不同。

提示

交互式地查看MYSQL_FIELD的成员值,调用mysql命令——column-type-info选项并执行一些示例查询。

  • char *的名字

    字段的名称,以null结尾的字符串。如果该字段的别名为作为条款的价值的名字是别名。对于过程参数,请使用参数名称。

  • char * org_name

    字段的名称,以null结尾的字符串。别名是忽略。对于表达式,值是一个空字符串。对于过程参数,请使用参数名称。

  • char *表

    包含此字段的表的名称(如果它不是计算字段)。对于计算字段,则表格Value为空字符串。如果从视图中选择了列,表格视图名称。如果给表或视图一个别名,则作为条款的价值表格是别名。对于一个联盟,值为空字符串。对于过程参数,请使用过程名称。

  • char * org_table

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

  • char * db

    字段所来自的数据库的名称,以null结尾的字符串。如果是计算字段,db是一个空字符串。对于一个联盟,值为空字符串。对于过程参数,为包含该过程的数据库的名称。

  • char *目录

    目录的名字。这个值总是“def”

  • char * def

    此字段的默认值,作为一个以空字符结尾的字符串。仅当您使用mysql_list_fields ()

  • 无符号长长度

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

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

    对于字符串列,长度值因连接字符集的不同而不同。例如,如果字符集是latin1,一个单字节字符集长度选择“abc”查询是3。如果字符集是utf8mb4的多字节字符集,其中的字符最多占用4个字节长度值是12。

  • 无符号长max_length

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

    的价值max_length是结果集中值的字符串表示形式的长度。例如,如果检索浮动列和宽的值是-12.345max_length的长度是7吗“-12.345”).

    如果你用的是预处理语句,max_length默认情况下没有设置,因为对于二进制协议,值的长度取决于结果集中值的类型。(见第6.2节,“C API准备好的语句数据结构”.)如果你想要max_length值,启用STMT_ATTR_UPDATE_MAX_LENGTH选项mysql_stmt_attr_set ()当你调用时,长度会被设置mysql_stmt_store_result ().(见, 6.4.3节提供“mysql_stmt_attr_set()”,部分6.4.28”mysql_stmt_store_result ().)

  • unsigned int name_length

    的长度的名字

  • unsigned int org_name_length

    的长度org_name

  • unsigned int table_length

    的长度表格

  • unsigned int org_table_length

    的长度org_table

  • unsigned int db_length

    的长度db

  • unsigned int catalog_length

    的长度目录

  • unsigned int def_length

    的长度def

  • unsigned int旗帜

    描述字段的位标志。的旗帜值可以有0个或多个在下表中显示的位集。

    标志值 国旗的描述
    NOT_NULL_FLAG 字段不能
    PRI_KEY_FLAG 字段是主键的一部分
    UNIQUE_KEY_FLAG 字段是唯一键的一部分
    MULTIPLE_KEY_FLAG 字段是非唯一键的一部分
    UNSIGNED_FLAG 领域有无符号属性
    ZEROFILL_FLAG 领域有补零属性
    BINARY_FLAG 领域有二进制属性
    AUTO_INCREMENT_FLAG 领域有AUTO_INCREMENT属性
    ENUM_FLAG 字段是一个枚举
    SET_FLAG 字段是一个
    BLOB_FLAG 字段是一个文本(弃用)
    TIMESTAMP_FLAG 字段是一个时间戳(弃用)
    NUM_FLAG 字段是数字;见下表的附加说明
    NO_DEFAULT_VALUE_FLAG 字段没有默认值;见下表的附加说明

    其中一些标志指示数据类型信息,并被替换或与MYSQL_TYPE_xxx的价值字段- >类型成员描述后:

    • 来检查时间戳值,检查是否类型MYSQL_TYPE_BLOBMYSQL_TYPE_TIMESTAMP.(BLOB_FLAGTIMESTAMP_FLAG国旗是不需要的)。

    • 枚举值以字符串的形式返回。对于这些,检查一下类型值是MYSQL_TYPE_STRINGENUM_FLAGSET_FLAG中设置的旗帜价值。

    NUM_FLAG表示列为数字。这包括类型为的列MYSQL_TYPE_DECIMALMYSQL_TYPE_NEWDECIMALMYSQL_TYPE_TINYMYSQL_TYPE_SHORTMYSQL_TYPE_LONGMYSQL_TYPE_FLOATMYSQL_TYPE_DOUBLEMYSQL_TYPE_NULLMYSQL_TYPE_LONGLONGMYSQL_TYPE_INT24,MYSQL_TYPE_YEAR

    NO_DEFAULT_VALUE_FLAG表示列没有默认的条款的定义。这并不适用于列(因为此类列的默认值为),或AUTO_INCREMENT列(具有隐含的默认值)。

    的典型用法旗帜值:

    if (field->flags & NOT_NULL_FLAG) printf(" field不能为空\n"); / /返回null

    控件的布尔状态可以使用下表中显示的方便宏来确定旗帜价值。

    旗帜的地位 描述
    IS_NOT_NULL(旗帜) 如果此字段定义为非空
    IS_PRI_KEY(旗帜) 如果该字段是主键,则为
    IS_BLOB(旗帜) 如果该字段为文本(弃用;测试字段- >类型相反)
  • unsigned int小数

    数字字段的小数数和时态字段的秒分数精度。

  • unsigned int charsetnr

    标识字段的字符集/排序对的ID号。

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

    若要区分字符串数据类型的二进制和非二进制数据,请检查charsetnr值是63。如果是,则字符集为二进制,表示二进制数据而不是非二进制数据。这使你能够区分二进制字符VARBINARYVARCHAR,类型的文本类型。

    charsetnr中显示的值相同Id列的显示排序声明或ID列的INFORMATION_SCHEMA整理表格您可以使用这些信息源查看特定于哪些字符集和排序规则charsetnr值指示:

    mysql>显示排序表Id = 63;+-----------+---------+----+---------+----------+---------+ | 排序|字符集|默认Id | | |编译Sortlen  | +-----------+---------+----+---------+----------+---------+ | 二进制的二进制| 63 | |是|是| 1  | +-----------+---------+----+---------+----------+---------+ mysql >选择COLLATION_NAME,从INFORMATION_SCHEMA CHARACTER_SET_NAME。id = 33的排序规则;+-----------------+--------------------+ | COLLATION_NAME | CHARACTER_SET_NAME  | +-----------------+--------------------+ | utf8_general_ci | utf8  | +-----------------+--------------------+
  • enum enum_field_types类型

    字段的类型。的类型价值可能是其中之一MYSQL_TYPE_符号如下表所示。

    类型值 类型描述
    MYSQL_TYPE_TINY 非常小的整数
    MYSQL_TYPE_SHORT 短整型
    MYSQL_TYPE_LONG 整数
    MYSQL_TYPE_INT24 MEDIUMINT
    MYSQL_TYPE_LONGLONG 长整型数字
    MYSQL_TYPE_DECIMAL 小数数字
    MYSQL_TYPE_NEWDECIMAL 精密的数学小数数字
    MYSQL_TYPE_FLOAT 浮动
    MYSQL_TYPE_DOUBLE 真正的
    MYSQL_TYPE_BIT
    MYSQL_TYPE_TIMESTAMP 时间戳
    MYSQL_TYPE_DATE 日期
    MYSQL_TYPE_TIME 时间
    MYSQL_TYPE_DATETIME DATETIME
    MYSQL_TYPE_YEAR 一年
    MYSQL_TYPE_STRING 字符二进制
    MYSQL_TYPE_VAR_STRING VARCHARVARBINARY
    MYSQL_TYPE_BLOB 文本字段(使用max_length以确定最大长度)
    MYSQL_TYPE_SET
    MYSQL_TYPE_ENUM 枚举
    MYSQL_TYPE_GEOMETRY 空间领域
    MYSQL_TYPE_NULL 类型字段

    MYSQL_TYPE_TIME2MYSQL_TYPE_DATETIME2,MYSQL_TYPE_TIMESTAMP2)类型代码只在服务器端使用。客户看到MYSQL_TYPE_TIMEMYSQL_TYPE_DATETIME,MYSQL_TYPE_TIMESTAMP代码。

    你可以使用IS_NUM ()宏来测试字段是否具有数值类型。通过类型价值IS_NUM ()如果字段是数值,它的计算结果为TRUE:

    if (IS_NUM(field->type)) printf(" field is numeric\n"); / /字段是数字的

    枚举值以字符串的形式返回。对于这些,检查一下类型值是MYSQL_TYPE_STRINGENUM_FLAGSET_FLAG中设置的旗帜价值。