我想使用mysql c api 求指定列的和。。mysql c api有这个函数吗? 可以直接返回求值的结果吗?

我想使用mysql c api 求指定列的和。。mysql c api有这个函数吗? 可以直接返回求值的结果吗?,第1张

MYSQL_OPT_READ_TIMEOUT 是 MySQL c api 客户端中用来设置读取超时时间的参数。在 MySQL 的官方文档中,该参数的描述是这样的:

MYSQL_OPT_READ_TIMEOUT (argument type: unsigned int *)The timeout in seconds for each attempt to read from the server. There are retries if necessary, so the total effective timeout value is three times the option value. You can set the value so that a lost connection can be detected earlier than the TCP/IPClose_Wait_Timeout value of 10 minutes.

也就是说在需要的时候,实际的超时时间会是设定值的 3 倍。但是实际测试后发现实际的超时时间和设置的超时时间一致。

而具体什么时候发生三倍超时,在文档中没有找到。所以对 MySQL 5.7.20 的源码进行了一些分析。

使用 GDB 调试代码找了实际与 mysql server 通信的代码,如下:

其中 vio_read() 函数中,使用 recv 和 poll 来读取报文和做读取超时。net_should_retry() 函数只有在发生 EINTR 时才会返回 true。从这段代码来看是符合测试结果的,并没有对读取进行三次重试。只有在读取 *** 作被系统中断打断时才会重试,但是这个重试并没有次数限制。

从上面代码的分析可以看出,代码的逻辑和文档的描述不符。于是在一顿搜索后,找到了一个 MySQL 的 BUG(Bug #31163)。该 BUG 报告了在 MySQL 5.0 中,MySQL c api 读取的实际超时时间是设置的三倍,与现有文档描述相符。于是对 MySQL 5.0.96 的代码又进行分析。

同样使用 GDB 找到了通信部分的代码。这次找到了重试三次的代码,如下:

这个版本的 MySQL api 的读写超时是直接使用的 setsockopt 设置的。第一次循环,在 A 点发生了第一次超时(虽然注释写的非阻塞,但是客户端的连接始终是阻塞模式的)。然后在 B 点将该 socket 设置为阻塞模式,C 点这里重置 retry 次数。由于设置了 alarm 第二次以后的循环会直接进入 D 点的这个分支,并且判断循环次数。作为客户端时net->retry_count 始终是 1,所以重试了两次,共计进行了 3 次 vioread 后从 E 点退出函数。

由上面的分析可知,MySQL 文档对于该参数的描述已经过时,现在的 MYSQL_OPT_READ_TIMEOUT 并不会出现三倍超时的问题。而 Bug #31163 中的处理结果也是将文档中该参数的描述更新为实际读取超时时间是设定时间的三倍。也许是 MySQL 的维护者们在后续版本更新时忘记更新文档吧。

linux ubuntu下用C连MySQL接数据mysql数据库的步骤如下:

1.安装mysql-server,在Ubuntu10.04下安装mysql-server-5.1,会自动安装mysql-client_5.1

sudo apt-get install mysql-server-5.1

2.C APIs包含在mysqlclient库文件中与MySQL的源代码一块发行,用于连接到数据库和执行数据库查询,因此需要安装libmysqlclient-dev

sudo apt-get install libmysqlclient-dev

假定已安装成功,相关文件如下:

头文件在/usr/include/mysql目录下;

库文件在/usr/lib/mysql和/usr/lib目录下

3.启动和关闭mysql

启动mysql:sudo start mysql

关闭mysql:sudo stop mysql

使用ps aux |grep mysql 查看mysql启动状态

ps命令用于查看当前系统中运行的进程信息,命令格式:ps [选项]

常见参数:

-a显示系统中所有进程,包括其他用户进程

-e显示所有进程信息

-f显示进程的所有信息

-l显示长格式显示进程的信息

-r只显示正在运行的程序

-u以用户的格式显示进程信息

-x显示所有终端上的进程信息

最常用的方法是ps aux,然后再利用一个管道符号导向到grep去查找特定的进程,然后再对特定的进程进行 *** 作。例如前面使用的ps aux |grep mysql

4.链接库时需要库文件,有静态库文件,也有动态库文件,也有名字相同的静态库文件和动态库文件,如何区分:

.o,.a,.so,.lo,.la后缀文件含义

.o:编译的目标文件

.a:静态库,其实就是把若干o文件打了个包

.so:动态链接库(共享库)

.lo:使用libtool编译出的目标文件,其实就是在o文件中添加了一些信息

.la:使用libtool编译出的库文件,其实是个文本文件,记录同名动态库和静态库的相关信息

la只有在用libtool编译应用程序或库时才用,即开发者只指明la文件,至于最终链接a还是so由libtool决定,不使用libtool的小程序用不上la。

5.连接MySql

a、连接到本机上的MYSQL:

首先打开终端窗口,再键入命令mysql -u root -p,回车后提示你输密码,如果刚安装好MYSQL,超级用户root是没有密码的,故直接回车即可进入

到MYSQL中了,MYSQL的提示符是:mysql>

b.修改密码,格式:mysqladmin -u用户名 -p旧密码 password 新密码

例1:给root加个密码ab12。首先打开终端窗口,然后键入以下命令:mysqladmin -uroot password ab12.(注:因为开始时root没有密码,所以-p旧密码一项就可以省略了)。

例2:再将root的密码改为djg345。 mysqladmin -uroot -pab12 password djg345 (注:u与root可以不用加空格,其它也一样)。

c、退出MYSQL命令: exit

6.增加新用户(注意:和上面不同,下面的因为是MYSQL环境中的命令,所以后面都带一个分号作为命令结束符)

格式:grant select on 数据库.* to 用户名@登录主机 identified by "密码"

例1、增加一个用户test1密码为abc,让他可以在任何主机上登录,并对所有数据库有查询、插入、修改、删除的权限。

首先用以root用户连入MYSQL,然后键入以下命令:grant select,insert,update,delete privileges on *.* to "test1"@"%" Identified by "abc" with grant option但例1增加的用户是十分危险的,

你想如某个人知道test1的密码,那么他就可以在internet上的任何一台电脑上登录你的mysql数据库并对你的数据可以为所欲为了,解决办法见例2。

例2、增加一个用户test2密码为abc,让他只可以在localhost上登录,并可以对数据库mydb进行查询、插入、修改、删除的 *** 作(localhost指本地主机,即MYSQL数据库所在的那台主机),

这样用户即使用知道test2的密码,他也无法从internet上直接访问数据库,只能通过MYSQL主机上的web页来访问了。

grant select,insert,update,delete on mydb.* to test2@localhost identified by “abc”如果你不想test2有密码,可再打一个命令将密码消掉。

grant select,insert,update,delete on mydb.* to test2@localhost identified by “”

例3、远程登录:

a、默认情况下Mysql只允许本地登录,所以需要修改配置文件将地址绑定给注释掉:

vi /etc/mysql/my.cnf

# Instead of skip-networking the default is now to listen only on

# localhost which is more compatible and is not less secure.

#bind-address = 127.0.0.1 <---注释掉这一行就可以远程登录了

b、允许远程登录后,还应设置远程登录权限:

mysql>grant all privileges on *.* to "root"@"%" identified by "123456" with grant option

c、使修改生效:

mysql>flush privileges

d、在另一台机器上远程登录(mysql所在机器地址:192.168.0.30):

mysql -h192.168.0.30 -uroot -p123456

e、如果仍不能登录,就把远程mysql关闭,之后重启

sudo stop mysql

sudo start mysql

7.显示命令:(注:下面来看看MYSQL中有关数据库方面的 *** 作。注意:必须首先登录到MYSQL中,以下 *** 作都是在MYSQL的提示符下进行的,而且每个命令以分号结束)。

a、显示数据库列表:show databases刚开始时才两个数据库:mysql和test。mysql库很重要它里面有MYSQL的系统信息,我们改密码和新增用户,实际上就是用这个库进行 *** 作。

b、显示库中的数据表:use mysqlshow tables

c、显示数据表的结构:describe 表名

d、建库: create database 库名

e、建表: use 库名create table 表名 (字段设定列表);

f、删库和删表: drop database 库名drop table 表名;

g、将表中记录清空:delete from 表名

h、显示表中的记录:select * from 表名


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/8544282.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-17
下一篇2023-04-17

发表评论

登录后才能评论

评论列表(0条)

    保存