想看看数据库方面的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语句的警告计数 |
翻译: