本篇内容主要讲解如何在Linux下用C语言来连接并操作MySQL数据库。
一.C API数据类型
1.MYSQL
MYSQL结构代表一个数据库连接的句柄,包含有关服务器的连接状态的信息,几乎所有的函数都要使用到它。要连接MySQL,必须建立MYSQL实例,通过mysql_init初始化方能开始进行连接。
MYSQL结构定义如下:
typedef struct st_mysql{
NET net; /*Communication parameters*/
gptr connector_fd; /*ConnectorFd for SSL*/
char *host,*user,*passwd,*unix_socket,*server_version,*host_info,*info,*db;
unsigned int port,client_flag,server_capabilities;
unsigned int protocol_version;
unsigned int field_count;
unsigned int server_status;
unsigned long thread_id; /*id for connection in server*/
my_ulonglong affected_rows;
my_ulonglong insert_id; /*id if insert on table wiht NEXTNR*/
my_ulonglong extra_info; /*Used by mysqlshow*/
unsigned long packet_length;
enum mysql_status status;
MYSQL_FIELD *fields;
MEM_ROOT field_alloc;
my_bool free_me; /*If free in mysql_close*/
my_bool reconnect; /*set to 1 if automatic reconnect*/
struct st_mysql_options options;
char scramble_buff[9];
struct charset_info_st *charset;
unsigned int server_language;
}MYSQL;
2.MYSQL_RES
MYSQL_RES结构代表返回行的查询结果(SELECT,SHOW,DESCRIBE)等。也将查询的返回信息称为结果集,从数据库读取数据,最后就是从MYSQL——RES中读取数据。
typedef struct st_mysql_res {
my_ulonglong row_count;
unsigned int field_count, current_field;
MYSQL_FIELD *fields;
MYSQL_DATA *data;
MYSQL_ROWS *data_cursor;
MEM_ROOT field_alloc;
MYSQL_ROW row; /* If unbuffered read */
MYSQL_ROW current_row; /* buffer to current row */
unsigned long *lengths; /* column lengths of current row */
MYSQL *handle; /* for unbuffered reads */
my_bool eof; /* Used my mysql_fetch_row */
} MYSQL_RES;
3.MYSQL_ROW
这是一个行数据的类型安全(type)。行通过my_sql_fetch_row()获得。
4.MYSQL_FIELD
这个结构包含字段信息,例如字段名、类型和大小。其成员在下面更详细地描述。你可以通过重复调用mysql_fetch_field()
对每一列获得MYSQL_FIELD
结构。字段值不是这个结构的部分;他们被包含在一个MYSQL_ROW
结构中。
typedef struct st_mysql_fiels{
char *name; /*name of column*/
char *table; /*table of column if column was a field*/
char *def; /*default value (set by mysql_list_fields)*/
enum enum_field_types type; /*type of field.see mysql_com.h for types*/
unsigned int length; /*width of column*/
unsigned int max_length; /*max width of selected set*/
unsigned int flags; /*div flags*/
unsigned int decimals; /*number of decimals in field*/
}MYSQL_FIELD;
5.my_ulonglong
长整型,用于函数的返回值,如mysql_affected_rows(),mysql_num_rows()和mysqlinsertid(),这些函数都翻会行计数或其他可能的大数值。
二.C API预处理
在此归纳了预处理语句处理功能可使用的函数,并在后面的章节中详细介绍了它。请参见25.2.7节,“C API预处理语句函数描述”。
函数 | 描述 |
mysql_stmt_affected_rows() | 返回由预处理语句UPDATE、DELETE或INSERT变更、删除或插入的行数目。 |
mysql_stmt_attr_get() | 获取预处理语句属性的值。 |
mysql_stmt_attr_set() | 设置预处理语句的属性。 |
mysql_stmt_bind_param() | 将应用程序数据缓冲与预处理SQL语句中的参数标记符关联起来。 |
mysql_stmt_bind_result() | 将应用程序数据缓冲与结果集中的列关联起来。 |
mysql_stmt_close() | 释放预处理语句使用的内存。 |
mysql_stmt_data_seek() | 寻找语句结果集中的任意行编号。 |
mysql_stmt_errno() | 返回上次语句执行的错误编号。 |
mysql_stmt_error() | 返回上次语句执行的错误消息。 |
mysql_stmt_execute() | 执行预处理语句。 |
mysql_stmt_fetch() | 从结果集获取数据的下一行,并返回所有绑定列的数据。 |
mysql_stmt_fetch_column() | 获取结果集当前行中某列的数据。 |
mysql_stmt_field_count() | 对于最近的语句,返回结果行的数目。 |
mysql_stmt_free_result() | 释放分配给语句句柄的资源。 |
mysql_stmt_init() | 为MYSQL_STMT结构分配内存并初始化它。 |
mysql_stmt_insert_id() | 对于预处理语句的AUTO_INCREMENT列,返回生成的ID。 |
mysql_stmt_num_rows() | 从语句缓冲结果集返回总行数。 |
mysql_stmt_param_count() | 返回预处理SQL语句中的参数数目。 |
mysql_stmt_param_metadata() | 返回结果集的参数元数据。 |
mysql_stmt_prepare() | 为执行操作准备SQL字符串。 |
mysql_stmt_reset() | 复位服务器中的语句缓冲区。 |
mysql_stmt_result_metadata() | 以结果集形式返回预处理语句元数据。 |
mysql_stmt_row_seek() | 使用从mysql_stmt_row_tell()返回的值,查找语句结果集中的行偏移。 |
mysql_stmt_row_tell() | 返回语句行光标位置。 |
mysql_stmt_send_long_data() | 将程序块中的长数据发送到服务器。 |
mysql_stmt_sqlstate() | 返回关于上次语句执行的SQLSTATE错误代码。 |
mysql_stmt_store_result() | 将完整的结果集检索到客户端。 |
调用mysql_stmt_init()以创建语句句柄,然后调用mysql_stmt_prepare准备语句,调用mysql_stmt_bind_param()提供参数数据,并调用mysql_stmt_execute()执行语句。通过更改mysql_stmt_bind_param()提供的相应缓冲区中的参数值,可重复执行mysql_stmt_execute()。
如果语句是SELECT或任何其他能生成结果集的语句,mysql_stmt_prepare()也会通过mysql_stmt_result_metadata()以MYSQL_RES结果集的形式返回结果集元数据信息。
你可以使用mysql_stmt_bind_result()提供结果缓冲,以便mysql_stmt_fetch()能自动将数据返回给这些缓冲。这是一种按行获取方式。
此外,你也能使用mysql_stmt_send_long_data()将程序块中的文本或二进制数据发送到服务器。请参见25.2.7.25节,“mysql_stmt_send_long_data()”。
完成语句执行后,必须使用mysql_stmt_close()关闭语句句柄,以便与之相关的所有资源均能被释放。
如果通过调用mysql_stmt_result_metadata()获得了SELECT语句的结果集元数据,也应使用mysql_free_result()释放元数据。
执行步骤
要想准备和执行语句,应用程序必须采取下述步骤:
1. 用msyql_stmt_init()创建预处理语句句柄。要想在服务器上准备预处理语句,可调用mysql_stmt_prepare(),并为其传递包含SQL语句的字符串。
2. 如果语句生成了结果集,调用mysql_stmt_result_metadata()以获得结果集元数据。虽然与包含查询返回列的结果集不同,该元数据本身也采用了结果集的形式。元数据结果集指明了结果中包含多少列,并包含每一列的信息。
3. 使用mysql_stmt_bind_param()设置任何参数的值。必须设置所有参数。否则,语句执行将返回错误,或生成无法预料的结果。
4. 调用mysql_stmt_execute()执行语句。
5. 如果语句生成了结果集,捆绑数据缓冲,通过调用mysql_stmt_bind_result(),检索行值。
6. 通过重复调用mysql_stmt_fetch(),按行将数据提取到缓冲区,直至未发现更多行为止。
7. 通过更改参数值并再次执行语句,重复步骤3到步骤6。
调用mysql_stmt_prepare()时,MySQL客户端/服务器协议将执行下述动作:
· 服务器解析语句,并通过赋值语句ID将OK状态发回客户端。此外,如果它是面向结果集的语句,还将发送总的参数数目,列计数和元数据。在此调用过程中,服务器将检查语句的所有语法和语义。
· 客户端采用该语句ID用于进一步操作,以便服务器能从其语句池中识别语句。
调用mysql_stmt_execute()时,MySQL客户端/服务器协议将执行下述动作:
· 客户端使用语句句柄,并将参数数据发送到服务器。
· 服务器使用由客户端提供的ID来识别语句,用新提供的数据替换参数标记符,并执行语句。如果语句生成了结果集,服务器将数据发回客户端。否则,服务器会将发送OK状态,以及总的变更、删除和插入行数。
调用mysql_stmt_fetch()时,MySQL客户端/服务器协议将执行下述动作:
· 客户端按行从信息包读取数据,并通过执行必要的转换操作将其放入应用程序数据缓冲中。如果应用程序的缓冲类型与服务器返回的字段类型相同,转换十分简明。
如果出现了错误,可分别使用mysql_stmt_errno()、mysql_stmt_error()和mysql_stmt_sqlstate()获取语句错误代码、错误消息和SQLSTATE值。
四.C API可用函数
-
1.mysql_affected_rows() //返回上次UPDATE、DELETE或INSERT查询更改/删除/插入的行数。
-
2.mysql_autocommit() //切换 autocommit模式,ON/OFF。
-
3.mysql_change_user() //更改打开连接上的用户和数据库。
-
4.mysql_charset_name() //返回用于连接的默认字符集的名称。
-
5.mysql_close() //关闭服务器连接。
-
6.mysql_commit() //提交事务。
-
7.mysql_data_seek() //在查询结果集中查找属性行编号。
-
8.mysql_debug() //用给定的字符串执行DBUG_PUSH。
-
9.mysql_dump_debug_info() //让服务器将调试信息写入日志。
-
10.mysql_errno() //返回上次调用的MySQL函数的错误编号。
-
11.mysql_escape_string() //为了用在SQL语句中,对特殊字符进行转义处理。
-
12.mysql_fetch_field() //返回下一个表字段的类型。
-
13.mysql_fetch_field_direct() //给定字段编号,返回表字段的类型。
-
14.mysql_fetch_fields() //返回所有字段结构的数组。
-
15.mysql_fetch_lengths() //返回当前行中所有列的长度。
-
16.mysql_fetch_row() //从结果集中获取下一行
-
17.mysql_field_seek() //将列光标置于指定的列。
-
18.mysql_field_count() //返回上次执行语句的结果列的数目。
-
19.mysql_field_tell() //返回上次mysql_fetch_field()所使用字段光标的位置。
-
20.mysql_free_result() //释放结果集使用的内存。
-
21.mysql_get_client_info() //以字符串形式返回客户端版本信息。
-
22.mysql_get_client_version() //以整数形式返回客户端版本信息。
-
23.mysql_get_host_info() //返回描述连接的字符串。
-
24.mysql_get_server_version() //以整数形式返回服务器的版本号。
-
25.mysql_get_proto_info() //返回连接所使用的协议版本。
-
26.mysql_get_server_info() //返回服务器的版本号。
-
27.mysql_info() //返回关于最近所执行查询的信息。
-
28.mysql_init() //获取或初始化MYSQL结构。
-
29.mysql_insert_id() //返回上一个查询为AUTO_INCREMENT列生成的ID。
-
30.mysql_kill() //杀死给定的线程。
-
31.mysql_library_end() //最终确定MySQL C API库。
-
32.mysql_library_init() //初始化MySQL C API库。
-
33.mysql_list_dbs() //返回与简单正则表达式匹配的数据库名称。
-
34.mysql_list_fields() //返回与简单正则表达式匹配的字段名称。
-
35.mysql_list_processes() //返回当前服务器线程的列表。
-
36.mysql_list_tables() //返回与简单正则表达式匹配的表名。
-
37.mysql_more_results() //检查是否还存在其他结果。
-
38.mysql_next_result() //在多语句执行过程中返回/初始化下一个结果。
-
39.mysql_num_fields() //返回结果集中的列数。
-
40.mysql_num_rows() //返回结果集中的行数。
-
41.mysql_options() //为mysql_connect()设置连接选项。
-
42.mysql_ping() //检查与服务器的连接是否工作,如有必要重新连接。
-
43.mysql_query() //执行指定为“以Null终结的字符串”的SQL查询。
-
44.mysql_real_connect() //连接到MySQL服务器。
-
45.mysql_real_escape_string() //考虑到连接的当前字符集,为了在SQL语句中使用,对字符串中的特殊字符进行转义处理。
-
46.mysql_real_query() //执行指定为计数字符串的SQL查询。
-
47.mysql_refresh() //刷新或复位表和高速缓冲。
-
48.mysql_reload() //通知服务器再次加载授权表。
-
49.mysql_rollback() //回滚事务。
-
50.mysql_row_seek() //使用从mysql_row_tell()返回的值,查找结果集中的行偏移。
-
51.mysql_row_tell() //返回行光标位置。
-
52.mysql_select_db() //选择数据库。
-
53.mysql_server_end() //最终确定嵌入式服务器库。
-
54.mysql_server_init() //初始化嵌入式服务器库。
-
55.mysql_set_server_option() //为连接设置选项(如多语句)。
-
56.mysql_sqlstate() //返回关于上一个错误的SQLSTATE错误代码。
-
57.mysql_shutdown() //关闭数据库服务器。
-
58.mysql_stat() //以字符串形式返回服务器状态。
-
59.mysql_store_result() //检索完整的结果集至客户端。
-
60.mysql_thread_id() //返回当前线程ID。
-
61.mysql_thread_safe() //如果客户端已编译为线程安全的,返回1。
-
62.mysql_use_result() //初始化逐行的结果集检索。
-
63.mysql_warning_count() //返回上一个SQL语句的告警数。
1.mysql_affected_rows() //返回上次UPDATE、DELETE或INSERT查询更改/删除/插入的行数。
2.mysql_autocommit() //切换 autocommit模式,ON/OFF。
3.mysql_change_user() //更改打开连接上的用户和数据库。
4.mysql_charset_name() //返回用于连接的默认字符集的名称。
5.mysql_close() //关闭服务器连接。
6.mysql_commit() //提交事务。
7.mysql_data_seek() //在查询结果集中查找属性行编号。
8.mysql_debug() //用给定的字符串执行DBUG_PUSH。
9.mysql_dump_debug_info() //让服务器将调试信息写入日志。
10.mysql_errno() //返回上次调用的MySQL函数的错误编号。
11.mysql_escape_string() //为了用在SQL语句中,对特殊字符进行转义处理。
12.mysql_fetch_field() //返回下一个表字段的类型。
13.mysql_fetch_field_direct() //给定字段编号,返回表字段的类型。
14.mysql_fetch_fields() //返回所有字段结构的数组。
15.mysql_fetch_lengths() //返回当前行中所有列的长度。
16.mysql_fetch_row() //从结果集中获取下一行
17.mysql_field_seek() //将列光标置于指定的列。
18.mysql_field_count() //返回上次执行语句的结果列的数目。
19.mysql_field_tell() //返回上次mysql_fetch_field()所使用字段光标的位置。
20.mysql_free_result() //释放结果集使用的内存。
21.mysql_get_client_info() //以字符串形式返回客户端版本信息。
22.mysql_get_client_version() //以整数形式返回客户端版本信息。
23.mysql_get_host_info() //返回描述连接的字符串。
24.mysql_get_server_version() //以整数形式返回服务器的版本号。
25.mysql_get_proto_info() //返回连接所使用的协议版本。
26.mysql_get_server_info() //返回服务器的版本号。
27.mysql_info() //返回关于最近所执行查询的信息。
28.mysql_init() //获取或初始化MYSQL结构。
29.mysql_insert_id() //返回上一个查询为AUTO_INCREMENT列生成的ID。
30.mysql_kill() //杀死给定的线程。
31.mysql_library_end() //最终确定MySQL C API库。
32.mysql_library_init() //初始化MySQL C API库。
33.mysql_list_dbs() //返回与简单正则表达式匹配的数据库名称。
34.mysql_list_fields() //返回与简单正则表达式匹配的字段名称。
35.mysql_list_processes() //返回当前服务器线程的列表。
36.mysql_list_tables() //返回与简单正则表达式匹配的表名。
37.mysql_more_results() //检查是否还存在其他结果。
38.mysql_next_result() //在多语句执行过程中返回/初始化下一个结果。
39.mysql_num_fields() //返回结果集中的列数。
40.mysql_num_rows() //返回结果集中的行数。
41.mysql_options() //为mysql_connect()设置连接选项。
42.mysql_ping() //检查与服务器的连接是否工作,如有必要重新连接。
43.mysql_query() //执行指定为“以Null终结的字符串”的SQL查询。
44.mysql_real_connect() //连接到MySQL服务器。
45.mysql_real_escape_string() //考虑到连接的当前字符集,为了在SQL语句中使用,对字符串中的特殊字符进行转义处理。
46.mysql_real_query() //执行指定为计数字符串的SQL查询。
47.mysql_refresh() //刷新或复位表和高速缓冲。
48.mysql_reload() //通知服务器再次加载授权表。
49.mysql_rollback() //回滚事务。
50.mysql_row_seek() //使用从mysql_row_tell()返回的值,查找结果集中的行偏移。
51.mysql_row_tell() //返回行光标位置。
52.mysql_select_db() //选择数据库。
53.mysql_server_end() //最终确定嵌入式服务器库。
54.mysql_server_init() //初始化嵌入式服务器库。
55.mysql_set_server_option() //为连接设置选项(如多语句)。
56.mysql_sqlstate() //返回关于上一个错误的SQLSTATE错误代码。
57.mysql_shutdown() //关闭数据库服务器。
58.mysql_stat() //以字符串形式返回服务器状态。
59.mysql_store_result() //检索完整的结果集至客户端。
60.mysql_thread_id() //返回当前线程ID。
61.mysql_thread_safe() //如果客户端已编译为线程安全的,返回1。
62.mysql_use_result() //初始化逐行的结果集检索。
63.mysql_warning_count() //返回上一个SQL语句的告警数。