mysql c语言 函数接口

想看看数据库方面的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 两个函数, 需要注意的是这两个函数只能返回最近调用的函数的状态,查看是否执行成功。


附表:

编号函数说明
1my_init初始化一个线程安全的句柄
2mysql_affected_rows返回UPDATE,DELETE,INSERT操作的行数
3mysql_autocommit打开或者关闭自动提交功能
4mysql_change_user再打开的数据库链接上修改用户
5mysql_character_set_name返回当前连接的默认字符集名称
6mysql_client_find_plugin返回指向插件的指针
7mysql_client_register_plugin注册一个插件
8mysql_close关闭服务器链接
9mysql_commit提交事务
10mysql_connect链接mysql服务器,但是推荐使用 mysql_real_connect
11mysql_create_db创建一个数据库,推荐使用CREATE_DATABASE
12mysql_data_seek在查询结果集中寻找任意行号
13mysql_debug使用DBUG_PUSH处理给定的字符串
14mysql_drop_db删除数据库,推荐使用DROP_DATABASE
15mysql_dump_debug_info将数据库调试信息写入日志
16mysql_eof判断是否读取到结果的最后一行,推荐使用mysql_errno或者mysql_error代替
17mysql_errno返回最近调用的MySQL函数的错误号
18mysql_error返回最近调用的MySQL函数的错误消息
19mysql_escape_string转义SQL语句字符串中的特殊字符
20mysql_fetch_field返回下一个表格字段的类型
21mysql_fetch_field_direct返回给定字段编号的对应字段的类型
22mysql_fetch_fields返回所有字段结构的数组
23mysql_fetch_lengths返回当前行中的列数
24mysql_fetch_row从结果集中获取下一行
25mysql_field_count返回最新语句的结果列数
26mysql_field_seek将列光标放在指定列上
27mysql_field_tell最后使用 mysql_fetch_field的光标位置
28mysql_free_result释放结果数据集所使用的内存
29mysql_get_character_set_info返回有关默认字符集的信息
30mysql_get_client_info以字符串形式返回客户端版本信息
31mysql_get_client_version以整数形式返回客户端版本信息
32mysql_get_host_info返回描述连接的字符串
33mysql_get_proto_info返回连接使用的协议版本
34mysql_get_server_info返回服务器版本号
35mysql_get_server_version以整数形式返回服务器版本号
36mysql_get_ssl_cipher返回当前的SSL密码
37mysql_hex_string以十六进制格式编码字符串
38mysql_info返回有关最近执行的查询的信息
39mysql_init获取或初始化MYSQL结构
40mysql_insert_id返回上一个查询为AUTO_INCREMENT列生成的ID
41mysql_kill杀死给定线程
42mysql_library_end结束MySQL C API库
43mysql_library_init初始化MySQL C API库
44mysql_list_dbs返回与简单正则表达式匹配的数据库名称
45mysql_list_fields返回与简单正则表达式匹配的字段名称
46mysql_list_processes返回当前服务器线程的列表
47mysql_list_tables返回与简单正则表达式匹配的表名
48mysql_load_plugin加载插件
49mysql_load_plugin_v加载插件
50mysql_more_results检查是否还有其他结果
51mysql_next_result返回/启动多结果执行中的下一个结果
52mysql_num_fields返回结果集中的列数
53mysql_num_rows返回结果集中的行数
54mysql_options设置mysql_real_connect的连接选项
55mysql_ping检查与服务器的连接是否正常,必要时重新连接
56mysql_plugin_options设置插件选项
57mysql_query执行指定为以空值终止的字符串的SQL查询
58mysql_real_connect连接到MySQL服务器
59mysql_real_escape_string使用连接的当前字符集,转义字符串中的特殊字符以用于SQL语句
60mysql_real_query执行指定为计数字符串的SQL查询
61mysql_refresh刷新或重置表和缓存
62mysql_reload告诉服务器重新加载授权表
63mysql_rollback事务回滚
64mysql_row_seek使用mysql_row_tell返回的值在结果集中寻找行偏移量
65mysql_row_tell返回行光标
66mysql_select_db选择一个数据库
67mysql_server_end结束MySQL C API库
68mysql_server_init初始化MySQL C API库
69mysql_set_character_set设置当前连接的默认字符集
70mysql_set_local_infile_default将LOAD DATA LOCAL处理程序回调设置为其默认值
71mysql_set_local_infile_handler安装特定于应用程序的LOAD DATA LOCAL处理回调
72mysql_set_server_option设置连接选项(如 multi-statements)
73mysql_sqlstate返回最后一个错误的SQLSTATE错误代码
74mysql_shutdown关闭数据库服务器
75mysql_ssl_set准备与服务器建立SSL连接
76mysql_stat以字符串形式返回服务器状态
77mysql_store_result检索完整的结果集给客户端
78mysql_thread_end完成线程处理程序
79mysql_thread_id返回当前线程ID
80mysql_thread_init初始化线程处理程序
81mysql_thread_safe如果客户端被编译为线程安全的,则返回1
82mysql_use_result启动逐行结果集检索
83mysql_warning_count返回前一条SQL语句的警告计数

翻译:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值