想看看数据库方面的c接口,但是找来找去,居然没有找到, 感觉这个资料应该得备一份,于是折腾了一上午。如果说文档侵权了啥的,我就删了,也是方便大家。


应用程序可以使用下面的步骤与mysql数据库进行交互:

  • 使用 mysql_library_init 初始化客户端函数库,这个函数在 libmysqlclient c 语言链接库 和 libmysqld 嵌入式服务链接库,所以我们使用的时候,需要使用-libmysqlclient 或者 -libmysqld进行编译。
  • 使用 mysql_init 函数初始化链接句柄,然后使用 mysql_real_connect 来连接服务器。
  • 检测数据库状态和运行查询语句。
  • 使用 mysql_close 关闭数据库服务器的远程链接。
  • 使用 mysql_library_end 关闭客服函数库调用。

注意: 如果不调用 mysql_library_end, 会有部分内存得不到释放,虽然重复链接不会增加内存,但是在内存比较少的情况下,可能会造成内存泄漏。

由于 mysql_init 在必要时候会教用 mysql_library_init函数, 所以不是多线程的情况 mysql_library_init 调用可以省略。 然而, mysql_library_init 不是线程安全函数, 所以 mysql_init 调用了 mysql_library_init 函数,也就不是线程安全函数了。所以不管是使用这两个函数哪一个函数,都需要在起新线程之前或者在临界区之间调用,这应该在任何其他客户端库调用之前完成。

链接服务器需要使用 mysql_init 初始化一个链接句柄, 然后就可以使用这个句柄加上主机地址、用户名及其密码、和数据库名称 来调用 mysql_real_connect 链接数据库了。连接后,mysql_real_connect 会在5.0.3之前的API版本中将重新连接标志(MYSQL结构的一部分)设置为1,在较新的版本中设置为0。我们也可以使用 mysql_option 函数来设置 MYSQL_OPT_RECONNECT 来控制是否重连。 再不用这个数据库的时候,需要调用 mysql_close 来关闭远程数据库链接。

当链接成功后, 客户端就可以通过 mysql_qurey 和 mysql_real_query 来发送sql语句到服务器进行查询, 两个函数不同的地方是前者的查询字符串使用’\0’结尾, 后者是指定查询字符串的字符个数。 如果查询字符串中不一定有 ‘\0’, 那么就推荐使用 mysql_real_query。

如果不是使用的 select 语句, 如 insert, update, delete 等语句, 我们可以调用 mysql_affected_rows 来查看执行结果中改变的行数。

对于 select 查询语句, 我们可以通过下面的方式来查询结果来得到想要的数据, 其他的 show, describe, explain等语句也是通过这种方式来得到查询结果。

其实是有提供了两种方式查询结果, 一种是一次性调用 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_use_result 的好处是避免了在客户端上大量使用内存,如果一次查询只使用少量的结果,那这种方式可能会更快. 不好的地方是我们需要频繁的访问服务器,也没有随机访问数据集的功能. 而且结果长度也只有在我们访问了所有的结果后才知道.此外,即使在检索中确定您已找到所需的信息,也必须检索所有行。

该 API 并不知道发送的语句是否是 select 查询语句, 只有在 mysql_store_result 的时候才会执行. 如果运行正常, 我们就可以访问到查询结果了. 可以调用 mysql_field_count 查看是否符合预期. 如果 mysql_field_count 返回0, 说明没有结果返回, 这样的指令包括 insert, update, delete 等, 表示没有返回结果. 如果 mysql_field_count 不等于0, 那就表明本身有结果返回,但是实际上没有接收到结果. 这就说明执行 select 失败了. 查看 mysql_field_count 可以得到怎么样完才的指导.

mysql_store_result 和 mysql_use_result 两个函数都可以让我们得到查询的结果, 我们可以在每行中, 重复的使用 mysql_fetch_filed 来获取一行中的信息, 也可以使用 mysql_fetch_field_direct 来获取指定列的数据, 当然也有类是的改变列指针位置的 mysql_filed_seek 函数. 可以通过调用 mysql_fetch_fields 来一次性获取全部结果.

为了检测和报告错误, mysql 提供了 mysql_errno 和 mysql_error 两个函数, 需要注意的是这两个函数只能返回最近调用的函数的状态,查看是否执行成功。


附表:

编号

函数

说明

1

my_init

初始化一个线程安全的句柄

2

mysql_affected_rows

返回UPDATE,DELETE,INSERT操作的行数

3

mysql_autocommit

打开或者关闭自动提交功能

4

mysql_change_user

再打开的数据库链接上修改用户

5

mysql_character_set_name

返回当前连接的默认字符集名称

6

mysql_client_find_plugin

返回指向插件的指针

7

mysql_client_register_plugin

注册一个插件

8

mysql_close

关闭服务器链接

9

mysql_commit

提交事务

10

mysql_connect

链接mysql服务器,但是推荐使用 mysql_real_connect

11

mysql_create_db

创建一个数据库,推荐使用CREATE_DATABASE

12

mysql_data_seek

在查询结果集中寻找任意行号

13

mysql_debug

使用DBUG_PUSH处理给定的字符串

14

mysql_drop_db

删除数据库,推荐使用DROP_DATABASE

15

mysql_dump_debug_info

将数据库调试信息写入日志

16

mysql_eof

判断是否读取到结果的最后一行,推荐使用mysql_errno或者mysql_error代替

17

mysql_errno

返回最近调用的MySQL函数的错误号

18

mysql_error

返回最近调用的MySQL函数的错误消息

19

mysql_escape_string

转义SQL语句字符串中的特殊字符

20

mysql_fetch_field

返回下一个表格字段的类型

21

mysql_fetch_field_direct

返回给定字段编号的对应字段的类型

22

mysql_fetch_fields

返回所有字段结构的数组

23

mysql_fetch_lengths

返回当前行中的列数

24

mysql_fetch_row

从结果集中获取下一行

25

mysql_field_count

返回最新语句的结果列数

26

mysql_field_seek

将列光标放在指定列上

27

mysql_field_tell

最后使用 mysql_fetch_field的光标位置

28

mysql_free_result

释放结果数据集所使用的内存

29

mysql_get_character_set_info

返回有关默认字符集的信息

30

mysql_get_client_info

以字符串形式返回客户端版本信息

31

mysql_get_client_version

以整数形式返回客户端版本信息

32

mysql_get_host_info

返回描述连接的字符串

33

mysql_get_proto_info

返回连接使用的协议版本

34

mysql_get_server_info

返回服务器版本号

35

mysql_get_server_version

以整数形式返回服务器版本号

36

mysql_get_ssl_cipher

返回当前的SSL密码

37

mysql_hex_string

以十六进制格式编码字符串

38

mysql_info

返回有关最近执行的查询的信息

39

mysql_init

获取或初始化MYSQL结构

40

mysql_insert_id

返回上一个查询为AUTO_INCREMENT列生成的ID

41

mysql_kill

杀死给定线程

42

mysql_library_end

结束MySQL C API库

43

mysql_library_init

初始化MySQL C API库

44

mysql_list_dbs

返回与简单正则表达式匹配的数据库名称

45

mysql_list_fields

返回与简单正则表达式匹配的字段名称

46

mysql_list_processes

返回当前服务器线程的列表

47

mysql_list_tables

返回与简单正则表达式匹配的表名

48

mysql_load_plugin

加载插件

49

mysql_load_plugin_v

加载插件

50

mysql_more_results

检查是否还有其他结果

51

mysql_next_result

返回/启动多结果执行中的下一个结果

52

mysql_num_fields

返回结果集中的列数

53

mysql_num_rows

返回结果集中的行数

54

mysql_options

设置mysql_real_connect的连接选项

55

mysql_ping

检查与服务器的连接是否正常,必要时重新连接

56

mysql_plugin_options

设置插件选项

57

mysql_query

执行指定为以空值终止的字符串的SQL查询

58

mysql_real_connect

连接到MySQL服务器

59

mysql_real_escape_string

使用连接的当前字符集,转义字符串中的特殊字符以用于SQL语句

60

mysql_real_query

执行指定为计数字符串的SQL查询

61

mysql_refresh

刷新或重置表和缓存

62

mysql_reload

告诉服务器重新加载授权表

63

mysql_rollback

事务回滚

64

mysql_row_seek

使用mysql_row_tell返回的值在结果集中寻找行偏移量

65

mysql_row_tell

返回行光标

66

mysql_select_db

选择一个数据库

67

mysql_server_end

结束MySQL C API库

68

mysql_server_init

初始化MySQL C API库

69

mysql_set_character_set

设置当前连接的默认字符集

70

mysql_set_local_infile_default

将LOAD DATA LOCAL处理程序回调设置为其默认值

71

mysql_set_local_infile_handler

安装特定于应用程序的LOAD DATA LOCAL处理回调

72

mysql_set_server_option

设置连接选项(如 multi-statements)

73

mysql_sqlstate

返回最后一个错误的SQLSTATE错误代码

74

mysql_shutdown

关闭数据库服务器

75

mysql_ssl_set

准备与服务器建立SSL连接

76

mysql_stat

以字符串形式返回服务器状态

77

mysql_store_result

检索完整的结果集给客户端

78

mysql_thread_end

完成线程处理程序

79

mysql_thread_id

返回当前线程ID

80

mysql_thread_init

初始化线程处理程序

81

mysql_thread_safe

如果客户端被编译为线程安全的,则返回1

82

mysql_use_result

启动逐行结果集检索

83

mysql_warning_count

返回前一条SQL语句的警告计数