MySQL数据库学习手册之MySQL客户工具和APIWord格式文档下载.docx
《MySQL数据库学习手册之MySQL客户工具和APIWord格式文档下载.docx》由会员分享,可在线阅读,更多相关《MySQL数据库学习手册之MySQL客户工具和APIWord格式文档下载.docx(13页珍藏版)》请在冰豆网上搜索。
![MySQL数据库学习手册之MySQL客户工具和APIWord格式文档下载.docx](https://file1.bdocx.com/fileroot1/2022-12/30/133e3be0-f8f3-4330-8252-96a3e0ffb353/133e3be0-f8f3-4330-8252-96a3e0ffb3531.gif)
如果你使用mysql_use_result,你必须保证没有其他线程在同一个连接上正在询问任何东西,直到结果集合被关闭。
20.2CAPI数据类型
MYSQL
这个结构表示对一个数据库连接的句柄,它被用于几乎所有的MySQL函数。
MYSQL_RES
这个结构代表返回行的一个查询的(SELECT,SHOW,DESCRIBE,EXPLAIN)的结果。
从查询返回的信息在本章下文称为结果集合。
MYSQL_ROW
这是一个行数据的类型安全(type-safe)的表示。
当前它实现为一个计数字节的字符串数组。
(如果字段值可能包含二进制数据,你不能将这些视为空终止串,因为这样的值可以在内部包含空字节)行通过调用mysql_fetch_row()获得。
MYSQL_FIELD
这个结构包含字段信息,例如字段名、类型和大小。
其成员在下面更详细地描述。
你可以通过重复调用mysql_fetch_field()对每一列获得MYSQL_FIELD结构。
字段值不是这个结构的部分;
他们被包含在一个MYSQL_ROW结构中。
MYSQL_FIELD_OFFSET
这是一个相对一个MySQL字段表的偏移量的类型安全的表示。
(由mysql_field_seek()使用。
)偏移量是在一行以内的字段编号,从0开始。
my_ulonglong
该类型用于行编号和mysql_affected_rows()、mysql_num_rows()和mysql_insert_id()。
这种类型提供0到1.84e19的一个范围。
在一些系统上,试图打印类型my_ulonglong的值将不工作。
为了打印出这样的值,将它变换到unsignedlong并且使用一个%lu打印格式。
例如:
printf(Numberofrows:
%lu\n"
(unsignedlong)mysql_num_rows(result));
MYSQL_FIELD结构包含列在下面的成员:
char*name
字段名,欢迎光临八一学习网,收藏本篇文章
$False$
是一个空结尾的字符串。
char*table
包含该字段的表的名字,如果它不是可计算的字段。
对可计算的字段,table值是一个空字符串。
char*def
这字段的缺省值,是一个空结尾的字符串。
只要你使用,只有你使用mysql_list_fields()才可设置它。
enumenum_field_typestype
字段类型。
type值可以是下列之一:
类型值类型含义
FIELD_TYPE_TINYTINYINT字段
FIELD_TYPE_SHORTSMALLINT字段
FIELD_TYPE_LONGINTEGER字段
FIELD_TYPE_INT24MEDIUMINT字段
FIELD_TYPE_LONGLONGBIGINT字段
FIELD_TYPE_DECIMALDECIMAL或NUMERIC字段
FIELD_TYPE_FLOATFLOAT字段
FIELD_TYPE_DOUBLEDOUBLE或REAL字段
FIELD_TYPE_TIMESTAMPTIMESTAMP字段
FIELD_TYPE_DATEDATE字段
FIELD_TYPE_TIMETIME字段
FIELD_TYPE_DATETIMEDATETIME字段
FIELD_TYPE_YEARYEAR字段
FIELD_TYPE_STRING字符串(CHAR或VARCHAR)字段
FIELD_TYPE_BLOBBLOB或TEXT字段(使用max_length决定最大长度)
FIELD_TYPE_SETSET字段
FIELD_TYPE_ENUMENUM字段
FIELD_TYPE_NULLNULL-类型字段
FIELD_TYPE_CHAR不推荐;
使用FIELD_TYPE_TINY代替
你可以使用IS_NUM()宏来测试字段是否有一种数字类型。
将type值传给IS_NUM()并且如果字段是数字的,它将计算为TRUE:
if(IS_NUM(field->
type))
printf("
Fieldisnumeric\n"
);
unsignedintlength
字段宽度,在表定义中指定。
unsignedintmax_length
对结果集合的字段的最大宽度(对实际在结果集合中的行的最长字段值的长度)。
如果你使用mysql_store_result()或mysql_list_fields(),这包含字段最大长度。
如果你使用mysql_use_result(),这个变量的值是零。
unsignedintflags
字段的不同位标志。
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(不推荐)
BLOB_FLAG字段是一个BLOB或TEXT(不推荐)
TIMESTAMP_FLAG字段是一个TIMESTAMP(不推荐)
BLOB_FLAG、ENUM_FLAG和TIMESTAMP_FLAG标志的使用是不推荐的,因为他们指出字段的类型而非它的类型属性。
欢迎光临八一学习网,收藏本篇文章
对FIELD_TYPE_BLOB、FIELD_TYPE_ENUM或FIELD_TYPE_TIMESTAMP,最好是测试field->
type。
下面例子演示了一个典型的flags值用法:
if(field->
flags&
NOT_NULL_FLAG)
Fieldcan'
tbenull\n"
你可以使用下列方便的宏决来确定flags值的布尔状态:
IS_NOT_NULL(flags)真,如果该字段被定义为NOTNULL
IS_PRI_KEY(flags)真,如果该字段是一个主键
IS_BLOB(flags)真,如果该字段是一个BLOB或TEXT(不推荐;
相反测试field->
type)
unsignedintdecimals
对数字字段的小数位数。
20.3CAPI函数概述
在CAPI中可用的函数列在下面,并且在下一节更详细地描述。
见20.4CAPI函数描述。
mysql_affected_rows()返回被最新的UPDATE,DELETE或INSERT查询影响的行数。
mysql_close()关闭一个服务器连接。
mysql_connect()连接一个MySQL服务器。
该函数不推荐;
使用mysql_real_connect()代替。
mysql_change_user()改变在一个打开的连接上的用户和数据库。
mysql_create_db()创建一个数据库。
而使用SQL命令CREATEDATABASE。
mysql_data_seek()在一个查询结果集合中搜寻一任意行。
mysql_debug()用给定字符串做一个DBUG_PUSH。
mysql_drop_db()抛弃一个数据库。
该函数
123456789不推荐;
而使用SQL命令DROPDATABASE。
mysql_dump_debug_info()让服务器将调试信息写入日志文件。
mysql_eof()确定是否已经读到一个结果集合的最后一行。
这功能被反对;
mysql_errno()或mysql_error()可以相反被使用。
mysql_errno()返回最近被调用的MySQL函数的出错编号。
mysql_error()返回最近被调用的MySQL函数的出错消息。
mysql_escape_string()用在SQL语句中的字符串的转义特殊字符。
mysql_fetch_field()返回下一个表字段的类型。
mysql_fetch_field_direct()返回一个表字段的类型,给出一个字段编号。
对与每个非--SELECT查询(例如,INSERT、UPDATE、DELETE等),你可以调用mysql_affected_rows()知道有多少行受到影响(改变)。
对于SELECT查询,你作为一个结果集合来检索选择的行。
(注意一些语句是类SELECT的,他们返回行。
这些包括SHOW、DESCRIBE和EXPLAIN。
他们应该象SELECT语句相同的方式来对待。
)
对客户,有两种方法处理结果集合。
一种方法是通过调用mysql_store_result()立刻
检索全部结果。
该函数从服务器获得查询返回的所有行,并将他们存储在客户端。
第二种方法是对客户通过调用mysql_use_result()初始化一个一行一行地结果集合的检索。
该函数初始化检索,但是实际上不从服务器获得任何行。
在两种情况中,你通过mysql_fetch_row()存取行。
用mysql_store_result()、mysql_fetch_row()储存取已经从服务器被取出的行。
用mysql_use_result()、mysql_fetch_row()实际上从服务器检索行。
调用mysql_fetch_lengths()可获得关于每行中数据值尺寸的信息。
在你用完一个结果集合以后,调用mysql_free_result()释放由它使用的内存。
两种检索机制是互补的。
客户程序应该选择最适合他们的要求的途径。
在实践中,客户通常更愿意使用mysql_store_result()。
mysql_store_result()的一个优点是既然行均被客户取到,你不仅能顺序存取行,你也能mysql_data_seek()或mysql_row_seek()在结果集合中前后移动以改变在结果集合中的当前行位置。
你也能通过调用mysql_num_rows()知道有多少行。
另一方面,mysql_store_result()的内存需求对较大结果集合可能很高,并且你最可能遇到out-of-memory情况。
mysql_use_result()的一个优点是客户为结果集合需要较少的内存,因为它一次只是维持一行(并且因为有较少的分配开销,mysql_use_result()能更快些)。
欢迎光临八一学习网,点击这里查看更多文章教程
缺点是你必须尽快处理每一行以避免困住服务器,你不必再结果集合中随意存取行(你只能顺序存取行),而且你不知道在结果集合中有多少行,直到你检索全部结果。
还有,你必须检索出所有行,即使你在检索中途确定你已找到了想寻找的信息。
API使得客户正确应答查询成为可能(仅检索必要的行),不用知道查询是否是一个SELECT。
你可以通过在mysql_query()(或mysql_real_query())之后调用mysql_store_result()做到。
如果结果集合调用成功并且查询是一个SELECT,你能读取行。
如果结果集合调用,调用mysql_field_count()确定结果是否是实际期望的。
如果mysql_field_count()返回0,查询没有返回数据(表明它是一个INSERT、UPDATE、DELETE等),所以不期望返回行。
如果mysql_field_count()是非零,查询应该有返回行,但是没有。
这表明查询是一个失败的SELECT。
见mysql_field_count()如何能做到的例子的描述。
<
20.4.2.2返回值
没有。
20.4.2.3错误
CR_COMMANDS_OUT_OF_SYNC
命令以一个不正确的次序被执行。
CR_SERVER_GONE_ERROR
MySQL服务器关闭了。
CR_SERVER_LOST
对服务者的连接在查询期间失去。
CR_UNKNOWN_ERROR
发生一个未知的错误。
20.4.3mysql_connect()
MYSQL*mysql_connect(MYSQL*mysql,constchar*host,constchar*user,constchar*passwd)
20.4.3.1说明
该函数不推荐使用,而更好使用mysql_real_connect()。
mysql_connect()试图建立一个对运行在host的一个MySQL数据库引擎的连接。
mysql_connect()必须在你能执行其他API函数之前成功地完成,除了mysql_get_client_info()。
参数的含义与mysql_connect()相应的参数相同,不同的是连接参数可以是NULL。
在这种情况下,CAPI
自动为连接结构分配内存,并且当你调用mysql_close(),释放它。
这种方法的缺点是如果连接失败,你不能检索出一条错误消息。
(为了从mysql_errno()或mysql_error()得到错误信息,你必须提供一个有效的MYSQL指针。
20.4.3.2返回值
同mysql_real_connect()。
20.4.3.3错误
20.4.4mysql_change_user()
my_boolmysql_change_user(MYSQL*mysql,constchar*user,constchar*password,constchar*db)
20.4.4.1说明
改变用户并且使得由db指定数据库成为由mysql指定的连接上的缺省(当前)数据库。
在随后的查询中,这个数据库是不包括一个明确的数据库指定符的表引用的缺省值。
这个函数功能在MySQL3.23.3中引入。
除非连接的用户能被认证或如果他没有权限使用数据库,mysql_change_user()失败。
在这种情况下,用户和数据库都没被改变。
如果你不想有一个缺省本文关键字:
20.4.8.3错误
20.4.8.4范例
if(mysql_drop_db(&
mysql,"
my_database"
))
fprintf(stderr,"
Failedtodropthedatabase:
Error:
%s\n"
mysql_error(&
mysql));
20.4.9mysql_dump_debug_info()
intmysql_dump_debug_info(MYSQL*mysql)
20.4.9.1说明
指示服务者将一些调试信息写入日志文件。
连接的用户对此必须有precess权限才能工作。
20.4.9.2返回值
如果命令成功,零。
如果发生一个错误,非零。
20.4.9.3错误
MySQL服务者关闭了。
对服务器的连接在查询期间失去。
20.4.10mysql_eof()
my_boolmysql_eof(MYSQL_RES*result)
20.4.10.1说明
这个函数不推荐,而使用mysql_errno()或mysql_error()。
mysql_eof()确定是否已经读到了一个结果集合的最后一行。
如果你从成功的mysql_store_result()调用获得一个结果集合,客户程序用一个操作收到全部集合。
在这种情况下,从mysql_fetch_row()返回一个NULL总是意味着已经到达了结果集合的尾部,没必要调用mysql_eof()。
在另一方面,如果你使用mysql_use_result()初始化一个结果集合的检索,该集合的行随着你重复调用mysql_fetch_row()一个一个地从服务器获得。
因为在这个过程中在连接上可能发生一个错误,从mysql_fetch_row()返回一个NULL值并不意味着集合正常到达了尾部。
在这种情况下,你能使用mysql_eof()确定发生了什么。
如果到达结果集合的尾部,mysql_eof()返回非零值,并且如果发生一个错误,返回零。
在时间上,mysql_eof()先于标准MySQL错误函数mysql_errno()和mysql_error()。
因为这些错误函数提供相同的信息,他们的使用更好本文关键字:
20.4.13.2范例
c
harquery,*end;
end=strmov(query,"
INSERTINTOtest_tablevalues("
*end++='
'
;
end+=mysql_escape_string(end,"
What'
sthis"
11);
'
binarydata:
\0\r\n"
16);
)'
if(mysql_real_query(&
mysql,query,(unsignedint)(end-query)))
{
fprintf(stderr,"
Failedtoinsertrow,Error:
}
例子中所用的strmov()函数被包括在mysqlclient库中且功能类似于strcpy(),但是返回一个指向空终止的第一个参数的指针。
20.4.13.3返回值
放进to的值的长度,不包括
123456789终止空字符。
20.4.13.4错误
无。
20.4.14mysql_fetch_field()
MYSQL_FIELD*mysql_fetch_field(MYSQL_RES*result)
20.4.14.1说明
返回作为一个MYSQL_FIELD结构的一个结果集合的一个列的定义。
重复调用这个函数在结果集合中检索所有关于列的信息。
当没有剩下更多的字段时,mysql_fetch_field()返回NULL。
在每次你执行一个新的SELECT查询,mysql_fetch_field()被重置(reset)以返回有关第一列的信息。
由mysql_fetch_field()返回的字段也受调用mysql_field_seek()的影响。
如果你调用mysql_query()在一张表上执行一个SELECT,但是没调用mysql_store_result(),如果你调用mysql_fetch_field()询问一个BLOB字段的长度,MySQL返回缺省BLOB长度(8K字节)。
(选择8K的长度是因为MySQL不知道BLOB的最大长度。
这应该在某个时候是它可配置)一旦你已经检索了结果集合,field->
max_length包含了在特定查询中对于该列最大值的长度。
20.4.14.2返回值
当前列的MYSQL_FIELD结构。