本节介绍 C API 数据结构,但不包括用于预处理语句、异步接口或复制流接口的结构。有关这些内容的信息,请参阅第 6.2 节,“C API 预处理语句数据结构”、第 7.2 节,“C API 异步接口数据结构”和第 10.2 节,“C API 二进制日志数据结构”。
-
此结构表示一个数据库连接的句柄。它几乎用于所有 MySQL 函数。请勿尝试复制
MYSQL
结构。不能保证此类副本可用。 -
此结构表示返回行的查询的结果(
SELECT
、SHOW
、DESCRIBE
、EXPLAIN
)。在本节的其余部分中,从查询返回的信息称为结果集。 -
这是数据一行数据的一种类型安全表示形式。它当前实现为一个计数字节字符串数组。(如果字段值可能包含二进制数据,则不能将它们视为以 null 结尾的字符串,因为此类值在内部可能包含 null 字节。)通过调用
mysql_fetch_row()
获取行。 -
此结构包含元数据:有关字段的信息,例如字段的名称、类型和大小。本节稍后将更详细地介绍其成员。您可以通过重复调用
mysql_fetch_field()
来获取每个字段的MYSQL_FIELD
结构。字段值不是此结构的一部分;它们包含在MYSQL_ROW
结构中。 -
这是 MySQL 字段列表中偏移量的类型安全表示形式。(由
mysql_field_seek()
使用。)偏移量是行内的字段编号,从零开始。 -
用于 64 位无符号整数的类型。
my_ulonglong
类型在 MySQL 8.0.18 之前使用。从 MySQL 8.0.18 开始,请改用uint64_t
C 类型。 -
布尔类型,用于值为真(非零)或假(零)。
my_bool
类型在 MySQL 8.0 之前使用。从 MySQL 8.0 开始,请改用bool
或int
C 类型。注意从
my_bool
到bool
的更改意味着mysql.h
头文件需要 C++ 或 C99 编译器才能编译。
MYSQL_FIELD
结构包含以下列表中描述的成员。这些定义主要适用于结果集的列,例如 SELECT
语句生成的结果集。MYSQL_FIELD
结构还用于为从使用预处理 CALL
语句执行的存储过程中返回的 OUT
和 INOUT
参数提供元数据。对于此类参数,某些结构成员的含义与列值的含义不同。
要以交互方式查看结果集的 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
字段是 BLOB
或TEXT
(已弃用)TIMESTAMP_FLAG
字段是 TIMESTAMP
(已弃用)NUM_FLAG
字段是数字;请参阅下表中的附加说明 NO_DEFAULT_VALUE_FLAG
字段没有默认值;请参阅下表中的附加说明 其中一些标志指示数据类型信息,并由稍后描述的
field->type
成员中的MYSQL_TYPE_
值取代或与其结合使用xxx
NUM_FLAG
指示列是数字。这包括类型为MYSQL_TYPE_DECIMAL
、MYSQL_TYPE_NEWDECIMAL
、MYSQL_TYPE_TINY
、MYSQL_TYPE_SHORT
、MYSQL_TYPE_LONG
、MYSQL_TYPE_FLOAT
、MYSQL_TYPE_DOUBLE
、MYSQL_TYPE_NULL
、MYSQL_TYPE_LONGLONG
、MYSQL_TYPE_INT24
和MYSQL_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
值的布尔状态。 -
无符号整数 decimals
数字字段的小数位数,以及时间字段的小数秒精度。
-
无符号整数 charsetnr
指示字段的字符集/排序规则对的 ID 号。
通常,结果集中的字符值将转换为
character_set_results
系统变量指示的字符集。在这种情况下,charsetnr
对应于该变量指示的字符集。可以通过将character_set_results
设置为NULL
来禁止字符集转换。在这种情况下,charsetnr
对应于原始表列或表达式的字符集。另请参阅连接字符集和排序规则。要区分字符串数据类型的二进制数据和非二进制数据,请检查
charsetnr
值是否为 63。如果是,则字符集为binary
,表示二进制数据而不是非二进制数据。这使您能够区分BINARY
和CHAR
、VARBINARY
和VARCHAR
,以及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
DECIMAL
或NUMERIC
字段MYSQL_TYPE_NEWDECIMAL
精确数学 DECIMAL
或NUMERIC
MYSQL_TYPE_FLOAT
FLOAT
字段MYSQL_TYPE_DOUBLE
DOUBLE
或REAL
字段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
CHAR
或BINARY
字段MYSQL_TYPE_VAR_STRING
VARCHAR
或VARBINARY
字段MYSQL_TYPE_BLOB
BLOB
或TEXT
字段(使用max_length
确定最大长度)MYSQL_TYPE_SET
SET
字段MYSQL_TYPE_ENUM
ENUM
字段MYSQL_TYPE_GEOMETRY
空间字段 MYSQL_TYPE_NULL
NULL
类型字段MYSQL_TYPE_TIME2
、MYSQL_TYPE_DATETIME2
和MYSQL_TYPE_TIMESTAMP2
)类型代码仅在服务器端使用。客户端看到的是MYSQL_TYPE_TIME
、MYSQL_TYPE_DATETIME
和MYSQL_TYPE_TIMESTAMP
代码。您可以使用
IS_NUM()
宏来测试字段是否具有数字类型。将type
值传递给IS_NUM()
,如果字段是数字,则它将评估为 TRUEif (IS_NUM(field->type)) printf("Field is numeric\n");
ENUM
和SET
值作为字符串返回。对于这些,请检查type
值是否为MYSQL_TYPE_STRING
以及flags
值中是否设置了ENUM_FLAG
或SET_FLAG
标志。