其实写这个程序真的很简单,十多分钟的事情,只是以前没在Linux下用纯C连过Mysql,想试一下,竟然搞了一整天,而且不是由于编码本身,是因为其他的一些周边问题,所以很有必要做一下笔记。

一、解决小的问题:

1、怎么自己去学着编写?

C语言针对MySql函数的帮助怎么查找:这些东西在MySql提供的帮助文档里都是有的,索引是C API。可以自己去下载chm格式的帮助文档,个人觉得这种文档比较好用,也可以去官网自行决定下载其他类型的帮助文档:http://dev.mysql.com/doc/,或者在线查找:https://dev.mysql.com/doc/refman/5.1/zh/apis.html。用高级语言编程其实就是学会使用帮助文档并付诸实践的过程。

2、在编写之前请确定自己有相关的头文件和库文件

关于这点,需要做点准备工作:

1、安装mysql:

sudo apt-get install mysql-server

2、安装库文件和头文件:

sudo apt-get install libmysqlclient-dev

也可以自己去官网下载对应mysql的安装包进行安装:http://dev.mysql.com/downloads/mysql/,单独下载connector的rpm或者tar包:http://dev.mysql.com/downloads/connector/。

如果是tar压缩包,解压出来,把include文件夹复制(cp命令,需root权限)到/usr/include/mysql/中,然后将lib文件夹复制到/usr/lib/mysql/中。

3、偶遇奇怪问题 fatal error: mysql/plugin_auth_common.h

这个问题其实不是什么大问题,是头文件引用的时候相对路径不对,如果编译器提示你某个头文件不存在,但是你在那个文件夹里查看又发现这个头文件其实是存在的。

比如说题述问题,我们在Linux下用C连mysql的时候要包含头文件:#include,编译的时候编译器提示错误,不存在?

其实我们可以找到的是/usr/include/mysql/mysql/plugin_auth_common.h,然后,把该头文件复制到父级目录即可,编译器就能正确找到这个头文件。

其实都是相对路径的问题。

4、怎么用GCC命令正确编译:

比如写好的文件为main.c,转到文件所在目录(cd命令),然后进行编译,并尝试执行:

gcc -o conn main.c -l mysqlclient

chmod +x conn

./conn

如果不加-lmysqlclient 链接选项的话,一般会提示undefined reference to `mysql_init' ,其实是因为init是最开始被调用的函数,所以它就最先提示这个而已。

如果想要调试的话可以用gdb,不过我自己用得都不是很熟,所以就不多说了。

5、Eclipse(Kepler-Cpp)构建针对MySql的开发环境:

Project->Properties->Settings->Cross GCC Compiler->Includes->Include paths(-I),包含如下两个路径:

/usr/include/mysql和/usr/lib/mysql,如图:

然后在Cross GCC Linker->Libraries中的Libraries(-I)中添加link:mysqlclient,在Library search path(-L)中添加路径/usr/lib/mysql,如图:

本来一开始我是在QtCreator里面写的,编译的时候发现不知道哪里加-l mysqlclient这个链接选项,没办法,一点都不会用qmake,也不会用cmake,然后就想用Eclipse来写,然后又发现Eclipse没办法识别mysql的那些头文件,于是又折腾了一阵子。写倒不是问题,主要是这些IDE调试的时候比较方便(其实也主要是因为不太会用GDB),唉,各种碰壁。

二、大问题,如果你不小心把/usr/lib的所属用户改了导致sudo命令用不了:

这个不相关的问题是怎么来的?其实就是因为编译器提示某个头文件找不到,我以为是当前用户没权限去访问/usr/lib/mysql文件夹里面的库文件(这个文件夹是cp过去的,当时我也不清楚它的权限状态)。于是我把/usr/lib/mysql文件夹的所属用户改成了nerohwang,而且还重启了计算机,悲剧了。

重新进入系统以后,每次使用sudo命令的时候都提示,/usr/lib下的某文件出错,该文件的所属用户必须是UID为0的用户(其实就是root用户)。

可想而知,一个使用Linux系统的人无法通过sudo来获取root权限是什么感觉,感觉就是什么事情都做不了。没错,可以通过su命令来变成root用户,但是我是没有对root指定密码的,所以没有办法,甚至一度想过对系统进行重装(自杀)。

后来想到去Windows系统下用软碟通(UltrISO)写一个Ubuntu系统到U盘里,然后U盘启动以后选试用Ubuntu而不是安装。进到试用系统后,获取根用户权限(竟然不用密码),然后将原系统的那些文件权限恢复:

sudo su

cd /你平时用的Linux根目录的路径(桌面系统会帮你把这个系统挂载上,你可以点选以后通过右键--属性选项查看)

chown -R root:root /usr/lib

chown -R root:root /usr/include

上面所说的,桌面系统会帮你挂载那个分区,当然也可以自行挂载:

fdisk -l       -------查看分区情况,比如说我们发现那个系统分区在/dev/sda1上:

mount /dev/sda1 /mnt/DirName        --需要根用户权限

重启,进入系统,恢复正常。所以说,根目录的东西不要去乱搞。

三、C连接MySql编程本身:

其实这个最没什么好说的,不过最后还是写了个Demo 。

开始建表如下:

id为INT,主键,AUTO_INCREMENT,text为varchar(15)。

程序源码:

1 /*Author:nerohwang2 Date:2014/3/7*/

3 #include

4 #include

5 #include

6 #include

7 #define INSERT_QUERY "INSERT INTO tblTest(text) values(?)"

8 void main(void)9 {10 size_t break_point = 0;11 printf("Hello World!\n");12 MYSQL *conn;13 MYSQL mysql;14 MYSQL_RES *mysql_res;15 MYSQL_ROW *mysql_row;16 MYSQL_FIELD *mysql_field;17 MYSQL_STMT *mysql_stmt;18 unsigned intnum_fields;19 const char * server = "localhost";20 const char *user = "root";21 const char *passwd = "cc527888";22 const char *dataBase = "dbTest";23 const char *query_select = "select * from tblTest";24 conn =mysql_init(NULL);25 if(!mysql_real_connect(conn,server,user,passwd,dataBase,0,NULL,0))26 {27 fprintf(stdout,"Error connecting to Mysql: %s\n",mysql_error(conn));28 }29 int t =mysql_query(conn,query_select);30 if(t) //t=0 means correct

31 {32 fprintf(stderr,"Query error occurs:%s\n",mysql_error(conn));33 }34

35 mysql_res =mysql_use_result(conn);36 if(mysql_res ==NULL)37 {38 fprintf(stderr,"Query error occurs: %s!\n",mysql_error(conn));39 }40 num_fields =mysql_num_fields(mysql_res);41 unsigned int num_rows =mysql_num_rows(mysql_res);42 printf("There're %d columns in the table tblTest\n",num_fields);43 //The code below won't return correct result until all rows in result_Set have been retieved

44 printf("There're %d rows affected in the table tblTest\n",num_rows);45 mysql_field =mysql_fetch_fields(mysql_res);46 unsigned int i=0;47 for(i=0; i< num_fields; i++)48 {49 printf("Field %u is %s\t",i,mysql_field[i].name);50 }51 printf("\n");52 size_t i_temp=0;53 while((mysql_row=mysql_fetch_row(mysql_res)))54 {55 printf("The ID %d is %s\n",++i_temp,mysql_row[1]);56 }57 num_rows =mysql_num_rows(mysql_res);58 printf("There're %d rows affected in the table tblTest\n",num_rows); //Now ,it's correct59

60

61 //Insert operation//62 if(!(mysql_stmt=mysql_stmt_init(conn)))63 {64 fprintf(stderr,"Statement initialization failed: %s\n",mysql_stmt_error(mysql_stmt));65 exit(0);66 }67 if(mysql_stmt_prepare(mysql_stmt,INSERT_QUERY,strlen(INSERT_QUERY))) //0 means correct

68 {69 fprintf(stderr,"Statament preparation failed:%s and %s\n",mysql_error(conn),mysql_stmt_error(mysql_stmt));70 exit(0);71 }72 fprintf(stdout,"Init and preparation succeeded!\n");73 MYSQL_BIND bind[1];74 memset(bind, 0, sizeof(bind));75 char *ch = "test_in";76 int lengthCH =strlen(ch);77 bind[0].buffer_type =MYSQL_TYPE_VARCHAR;78 bind[0].buffer =ch;79 bind[0].is_null = 0;80 bind[0].length = &lengthCH;81 if(mysql_stmt_bind_param(mysql_stmt, bind))82 {83 fprintf(stderr, "mysql_stmt_bind_param() failed\n");84 fprintf(stderr, "%s\n", mysql_stmt_error(mysql_stmt));85 exit(0);86 }87

88 if(mysql_stmt_execute(mysql_stmt))89 {90 fprintf(stderr,"Execution failed:%s\n",mysql_stmt_error(mysql_stmt));91 exit(0);92 }93 my_ulonglong affected_rows=mysql_stmt_affected_rows(mysql_stmt);94 fprintf(stdout, "total affected rows(insert 1): %l\n",95 (unsigned long) affected_rows);96

97 if(mysql_stmt_close(mysql_stmt))98 {99 fprintf(stderr, "failed while closing the statement\n");100 fprintf(stderr, "%s\n", mysql_stmt_error(mysql_stmt));101 exit(0);102 }103 //Insert opration success104 mysql_close(conn);105 printf("End of the file\n");106 }

C_Mysql

执行若干次以后结果如下:

写完,睡觉。

linux下c 上传图片到mysql_Linux下C连接MySql数据库相关推荐

  1. Linux JSP连接MySQL数据库

    Linux(Ubuntu平台)JSP通过JDBC连接MySQL数据库,与Windows平台类似,步骤如下: 下载 jdbc: mysql-connector-java-5.1.18.tar.gz 解压 ...

  2. Linux Java连接MySQL数据库

    Linux(Ubuntu平台)Java通过JDBC连接MySQL数据库,与Windows平台类似,步骤如下: 下载 jdbc: mysql-connector-java-5.1.18.tar.gz 解 ...

  3. linux 指定库名 登录mysql_linux下对应mysql数据库的常用操作

    ssh管理工具连接mysql数据库. 一.连接mysql数据库: 通过shh管理工具,登录linux的用户名,密码,进入ssh的命令行界面后,执行如下命令: mysql -u 数据库用户名 -p 然后 ...

  4. 在Linux环境下mysql的root密码忘记解决方法 1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库。 2.修改MySQL的登录设置: # vi /etc/my.c

    在Linux环境下mysql的root密码忘记解决方法 1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库. 2.修改MySQL的登录设置: # vi /etc/my.cnf ...

  5. linux(ARM架构)下的mysql安装、QT连接mysql数据库(完整版)

    一.安装MYSQL之前要先换源 二.安装MYSQL 1.安装 2.安装完成 3.安装后无法登陆 3.1 原因 3.2 登陆后切换database 3.3 修改密码(注意这里账号和密码是双引号) 3.4 ...

  6. linux mysql如何远程连接mysql数据库,Linux下远程连接MySQL数据库的方法

    Linux下远程连接MySQL数据库的方法 踩坑笔记 估计搞了一个多小时才把这个远程连接搞好.一台本地电脑,一台云服务器,都是linux系统. 步骤 1.在服务器端开启远程访问 首先进入mysql数据 ...

  7. Linux下编译连接mysql数据库

    1.在Linux下编译连接mysql数据库的程序时,需要使用安装Mysql数据库时自带的mysql_config脚本.它会为你编译MySQL客户端,并连接到MySQL服务器提供有用的信息.需要使用下面 ...

  8. linux下java连接mysql_LinuxJava连接MySQL数据库

    Linux(Ubuntu平台) Java 通过JDBC连接MySQL数据库,与Windows平台类似,步骤如下: 解压 jdbc: tar -zxvf mysql-connector-java-5.1 ...

  9. linux ftp mysql_linux搭建ftp服务——未连接mysql数据库的做法

    ftp服务很重要,这里介绍ftp在linux上不连接mysql数据库的搭建方法,ftp也可以连接mysql,有时间再生成文档. 先说明ftp的基本原理:FTP –File Transfer Proto ...

  10. mac php 连接mysql数据库_Mac环境下php操作mysql数据库的方法分享

    Mac环境下php操作mysql数据库的方法分享 今天在mac上搭建好了php的环境,我们就把php操作mysql数据库的方法分享给大家,有需要的小伙伴参考下. Mac本地环境搭建 在Mac系统,我们 ...

最新文章

  1. 微服务治理实践:服务查询
  2. editActionsForRowAtIndexPath(iOS8) tableview编辑(删除、插入、移动)
  3. 深入理解HTTP协议
  4. Android 系统(248)---解读Android进程优先级ADJ算法
  5. 倒序排序_排序不等式,切比雪夫不等式及伯努利不等式
  6. 湖南省第六届大学生计算机程序设计竞赛---数字整除
  7. 后台userlist.php,后台用户管理(管理员登录后管理会员)
  8. 后现代婚礼机器人显神通_机器人+无人机 江西新余智能消防显“神通”
  9. android 性能测试 简介,android性能测试工具traceview简介[转载]
  10. 安装duetdisplay遇到的问题
  11. 老王python培训视频教程完整版
  12. 怎样更改itunes备份位置_iTunes备份路径在哪?iTunes备份路径如何修改
  13. Docker 配置容器固定IP
  14. Network--名词解释
  15. ubuntu 22.0 不能调节屏幕亮度
  16. 仿 Drools 决策表 Groovy 实现
  17. dva开发框架简介和演示
  18. 雷库兹韦尔量子计算机,人物 | 他说,再挺11年,送你长生不老,要不要?
  19. 【服务器】本地运行成功,但服务器上运行却显示错误500
  20. 叠加等边三角形的绘制 python_叠_叠是什么意思_叠字怎么读_叠的含义_叠字组词-新东方在线字典...

热门文章

  1. Process when we start our testing work
  2. BackgroundWorker的使用
  3. javascript模拟抽奖
  4. SQlite 发布3.2.5版本
  5. Linux操作系统中的路由表配置
  6. day25-python之继承组合
  7. 利用predis操作redis方法大全
  8. zabbix api 接口的自动化
  9. 在类库中使用Session
  10. OLE 操作Excel 祥解