文档章节

mysql 编程笔记

wangxuwei
 wangxuwei
发布于 2016/10/25 15:30
字数 1177
阅读 17
收藏 0

要进行linux下的mysql的C编程,需要安装mysql及mysql的开发包,ubuntu下直接apt-get install libmysql++安装开发包。

#include <mysql.h>

相关函数:

MYSQL *mysql_init(MYSQL *);
//这里称之为载入函数吧,返回的MYSQL指针要用到后续的函数中

int mysql_options(MYSQL *connection, enum option_to_set,const char *argument);
//设置MYSQL*的一些属性,比如超时时间等

MYSQL *mysql_real_connect(MYSQL *connection,
                const char *server_host,
                const char *sql_user_name,
                const char *sql_password,
                const char *db_name,
                unsigned int port_number,//置0连接默认端口,一般为3306
                const char *unix_socket_name,//NULL
                unsigned int flags);//无另外属性时置0
//连接函数

void mysql_close(MYSQL *connection);
//关闭连接

unsigned int mysql_errno(MYSQL *connection);
//返回错误代码

char *mysql_error(MYSQL *connection);

//返回错误信息

int mysql_query(MYSQL *connection, const char *query);
//执行sql语句

my_ulonglong mysql_affected_rows(MYSQL *connection);
//返回执行语句过后受影响的行数

MYSQL_RES *mysql_store_result(MYSQL *connection);
//返回执行结果,适用于数据量较小时

my_ulonglong mysql_num_rows(MYSQL_RES *result);
//返回上面函数返回结果的行数

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
//抽取一条记录,返回NULL时表示抽取完记录或者错误

void mysql_data_seek(MYSQL_RES *result, my_ulonglong offset);
//调整数据位置,offset为0时,下次调用mysql_fetch_row将返回result第一条记录

MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES *result);
//返回当前的位置

MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES *result, MYSQL_ROW_OFFSET offset);
//移动数据位置,并返回先前的位置,可以和上一个函数结合使用

void mysql_free_result(MYSQL_RES *result);
//释放result空间

MYSQL_RES *mysql_use_result(MYSQL *connection);
//返回执行结果,适用于数据量较大时

unsigned int mysql_field_count(MYSQL *connection);
//返回查询结果中的列数(column数)

MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result);
//获得查询结果中的列名等信息(表头信息)

例子:

创建测试数据库
mysql> create database test;
创建用户(已经创建)
mysql> grant all on test.* to mymotif@'localhost' identified by 'xxxxx';

sql文件:

--
-- Create the table children
--
CREATE TABLE children (
childno int(11) NOT NULL auto_increment,
fname varchar(30),
age int(11),
PRIMARY KEY (childno)
);
--
-- Populate the table ‘children’
--

INSERT INTO children(childno,fname,age) VALUES(1,'Jenny',21);
INSERT INTO children(childno,fname,age) VALUES(2,'Andrew',17);
INSERT INTO children(childno,fname,age) VALUES(3,'Gavin',8);
INSERT INTO children(childno,fname,age) VALUES(4,'Duncan',6);
INSERT INTO children(childno,fname,age) VALUES(5,'Emma',4);
INSERT INTO children(childno,fname,age) VALUES(6,'Alex',15);
INSERT INTO children(childno,fname,age) VALUES(7,'Adrian',9);

导入sql文件:

mysql -u mymotif --password=xxxx test<mysqlchildren.sql

导入后的情况:

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| children |
+----------------+
1 row in set (0.00 sec)

mysql> select * from children;
+---------+--------+------+
| childno | fname | age |
+---------+--------+------+
| 1 | Jenny | 21 |
| 2 | Andrew | 17 |
| 3 | Gavin | 8 |
| 4 | Duncan | 6 |
| 5 | Emma | 4 |
| 6 | Alex | 15 |
| 7 | Adrian | 9 |
+---------+--------+------+
7 rows in set (0.00 sec)

C代码:

/*
 *
 *   gcc mysqltest.c -o mysqltest  -I/opt/mysql/include -L/opt/mysql/lib -lmysqlclient -lpthread -lm -lrt -ldl
 *
 *   gcc mysqltest.c -o mysqltest  `mysql_config --cflags --libs`
 *
 * */

#include <stdio.h>
#include <stdlib.h>
#include <mysql.h>

MYSQL *mysql_main;
MYSQL_RES *res_ptr;
MYSQL_ROW sqlrow;
void display_header();
void display_row();
int main(int argc,char *argv[])
{
	int res;
	int first_row = 1;

	mysql_main = mysql_init(NULL);

	if(!mysql_main)
	{
		fprintf(stderr,"mysql_init failed\n");
		return EXIT_FAILURE;
	}
	mysql_main = mysql_real_connect(mysql_main,"localhost","mymotif","wxwpxh","test",0,NULL,0);
	if(mysql_main)
	{
		printf("Connection success:\n");
		res = mysql_query(mysql_main,"SELECT childno,fname,age FROM children WHERE age>5");
		if(res)
		{
			fprintf(stderr,"SELECT error: %s\n",mysql_error(mysql_main));
		}
		else
		{
			res_ptr = mysql_use_result(mysql_main);
			if(res_ptr)
			{
				while((sqlrow = mysql_fetch_row(res_ptr)))
				{
					if(first_row)
					{
						display_header();
						first_row = 0;
					}
					display_row();
				}
			}
		}
	}
	else
	{
		printf("Connection failed\n");
	}
	mysql_close(mysql_main);
	return EXIT_SUCCESS;
}
void display_header()
{
	MYSQL_FIELD *field_ptr;
	printf("Column details:\n");
	while((field_ptr = mysql_fetch_field(res_ptr))!=NULL)
	{
		printf("\t Name: %s\n",field_ptr->name);
		printf("\t Type: ");
		if(IS_NUM(field_ptr->type))
		{
			printf("Numeric filed\n");
		}
		else
		{
			switch(field_ptr->type)
			{
				case FIELD_TYPE_VAR_STRING:
					printf("VARCHAR\n");
					break;
				case FIELD_TYPE_LONG:
					printf("LONG\n");
					break;
				default:
					printf("Type is %d,check in mysql_com.h\n",field_ptr->type);
			}
		}
		printf("\t MAX width %ld\n",field_ptr->length);
		if(field_ptr->flags&AUTO_INCREMENT_FLAG)
		  printf("\t Auto increments\n");
		printf("\n");
	}
}
void display_row()
{
	unsigned int field_count;

	field_count = 0;
	while(field_count<mysql_field_count(mysql_main))
	{
		if(sqlrow[field_count]) printf("%s ",sqlrow[field_count]);
		else printf("NULL");
		field_count++;
	}
	printf("\n");
}

$ ./mysqltest 
Connection success:
Column details:
     Name: childno
     Type: Numeric filed
     MAX width 11
     Auto increments

     Name: fname
     Type: VARCHAR
     MAX width 30

     Name: age
     Type: Numeric filed
     MAX width 11

1 Jenny 21 
2 Andrew 17 
3 Gavin 8 
4 Duncan 6 
6 Alex 15 
7 Adrian 9 

注意事项:

当mysql用编译源码或二进制方式安装时(非apt-get install),而系统又通过apt安装了mysql客户端(由于依赖关系),这时链接mysqlclient 会连到apt安装的那个库:

$ ldd mysqltest
    linux-vdso.so.1 =>  (0x00007ffc5a9a0000)
    libmysqlclient.so.20 => /usr/lib/x86_64-linux-gnu/libmysqlclient.so.20 (0x00007f9c0d5e6000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9c0d21c000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f9c0cfff000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f9c0cdfb000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f9c0cbf2000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f9c0c86a000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f9c0c561000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f9c0c349000)

/usr/lib/x86_64-linux-gnu/libmysqlclient.so.20 -> /usr/lib/x86_64-linux-gnu/libmysqlclient.so.20.3.2

编译安装的服务器和客户端与apt安装客户端socket文件不一致:编译安装的是/tmp/mysql.sock

apt安装客户端会连接/var/run/mysqld/mysqld.sock。显然/var/run/mysqld/mysqld.sock是不存在的。

mysql_real_connect(mysql_main,"localhost","mymotif","wxwpxh","test",0,NULL,0),用localhost(unix socket方式)是连不上服务器,提示:Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)。用127.0.0.1是可以的(采用tcp方式)。

解决办法:

把/usr/lib/x86_64-linux-gnu/libmysqlclient.so.20连接到服务器的那个库。

 sudo ln -s /opt/mysql-5.7.14-linux-glibc2.5-x86_64/lib/libmysqlclient.so.20.3.1  /usr/lib/x86_64-linux-gnu/libmysqlclient.so.20

 

 

 

本文转载自:http://www.cnblogs.com/co1d7urt/archive/2012/10/23/2735320.html

wangxuwei
粉丝 27
博文 343
码字总数 137316
作品 0
杭州
其他
私信 提问
Golang学习笔记目录

Golang 介绍 Go语言是谷歌2009发布的第二款开源编程语言。 Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全、支持并行进程。...

ChainZhang
2017/12/26
0
0
ASP和PHP语言哪个更适合建设个人读书笔记博客网站?[图]

在我接触的编程语言中,ASP和PHP是我笔记熟悉的,但实际上我对编写程序并不是很懂,但对程序语言却接触的笔记早。早在2006年,我就接触了ASP语言,因为ASP脚本语言在那个时代是非常流行的,我...

原创小博客
2018/07/04
19
1
PHP 在写数据插入数据库的功能,插入成功后数据库里中文显示乱码。。。

我用的是mysql 用 PhpMyAdmin创建的数据库,记得最初选编码的时候写的是UTF-8-bin 然后我的编程环境里都设的是UTF-8,Name字段定义的是varchar(8), 现在插入中文的时候数据库里就显示为乱码了...

错II过
2014/03/17
1K
7
MoreWindows博客目录(微软最有价值专家,原创技术文章152篇)

为了方便大家查找和学习,现将本人博客中所有博客文章列出目录。 一. 白话经典算法 目前有17篇,分为七大排序和经典面试题讲解两大类 1. 《白话经典算法系列之一 冒泡排序的三种实现》 2. 《...

morewindows
2013/12/24
0
0
互联网技术栈 『Contents Catalog』

image.png 编程语言 Java书单——由入门到上天 UML-类间关系 Java解读-ThreadLocal详解与应用 并发编程-Concurrent用户指南 Java并发编程-原子性变量 Java 并发工具包-常用线程池 基于事件驱...

高广超
2017/11/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

程序设计基础(C)第06讲例程

1summing.c /* summing.c -- 根据用户键入的整数求和 */#include <stdio.h>int main(void){ long num; long sum = 0L; /* 把sum 初始化为0 */ int status; p......

树人大学数字媒体吴凡
12分钟前
4
0
聊聊nacos config的publishConfig

序 本文主要研究一下nacos config的publishConfig ConfigController nacos-1.1.3/config/src/main/java/com/alibaba/nacos/config/server/controller/ConfigController.java @Controller@R......

go4it
39分钟前
3
0
Eureka应用注册与集群数据同步源码解析

在之前的EurekaClient自动装配及启动流程解析一文中我们提到过,在构造DiscoveryClient类时,会把自身注册到服务端,本文就来分析一下这个注册流程 客户端发起注册 boolean register() t...

Java学习录
49分钟前
11
0
Java描述设计模式(15):责任链模式

本文源码:GitHub·点这里 || GitEE·点这里 一、生活场景描述 1、请假审批流程 公司常见的请假审批流程:请假天数 当 day<=3 天,项目经理审批当 3<day<=5 天,部门经理审批当 day>5 天...

知了一笑
59分钟前
10
0
总结:数组与链表

1、内存申请:数组在内存上是连续的空间;链表,内存地址上可以是不连续的。 2、查询速度:数组可以随机访问,链表必须顺序访问,即从首个元素开始遍历,逐个查找,所以数组查询很快。 3、写入...

浮躁的码农
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部