在网上翻来覆去找不到一套适合新手自学的书,于是买了课,急急忙忙上完了课,又发现全还给老师了。 这一系列文放在这里,从下载软件开始,记录一条MySQL入门之旅。 新手也可以跟着这条路走,一条道走到黑。 粉丝可见,愿者上钩。 有任何疑问,参考三篇上课笔记,或者私信我。
我也是个新手,所以这个整理的可能会比较杂,蛮看,等入门之后在拿个小项目练一下就熟悉了。
使用命令(安装mysql):
sudo apt-get install mysql-server
sudo apt-get install mysql-client
sudo apt-get install libmysqlclient-dev
sudo apt-get install emma
这要安不上,度娘在边上。
//Linux下
//mysqltest.cpp 代码如下:
#include <stdio.h>
//确保在/usr/include/mysql下有mysql.h文件
#include "mysql/mysql.h"
//windows下
#include <WinSock2.h> // 进行网络编程需要winsock2.h
#include <mysql.h>
#pragma comment(lib, “libmysql.lib”)
后面的示例代码是一份windows下的,不过建议大家熟悉之后改成Linux版本的,毕竟咱这学C++的嘛,跟Linux感情还是好一点。
/*连接句柄 整个MYSQL开发的核心*/
MYSQL * mysql;
/*初始化*/
MYSQL *mysql_init(MYSQL *mysql);
/*设置连接选项*/
int mysql_options(MYSQL *mysql, enum mysql_option option, const char *arg);
/*打开连接*/
MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db,
unsigned int port, const char *unix_socket, unsigned long client_flag);
/*执行SQL语句*/
int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length);
/*如果SQL语句是C风格字符串,可以直接用下面的函数*/
int mysql_query(MYSQL *mysql, const char *query);
/*SQL语句一般只能是一条语句,如果你想在一个函数调用中执行多个SQL语句,需要以;隔开,并且设置在打开连接时设置属性*/
CLIENT_MULTI_STATEMENTS
/*或者对已经打开的连接进行以下函数调用设置,其中mysql为MYSQL的指针*/
mysql_set_server_option(mysql,MYSQL_OPTION_MULTI_STATEMENTS_ON);
/*如果执行的是一个有返回结果的语句,可以用下列函数获取结果*/
MYSQL_RES *mysql_use_result(MYSQL *mysql);
MYSQL_RES *mysql_store_result(MYSQL *mysql);
/*其中前一个函数只是初始化MYSQL_RES结构体,并不真正从服务器获取结果,后一个函数直接将全部数据读取到客户端*/
/*MYSQL_RES结构体可以通过以下函数获得数据*/
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
/*该函数返回的MYSQL_ROW类型实际为 char** 类型,通过下标操作可以取得每一列的值*/
/*可以通过以下函数获得结果集的列数*/
unsigned int mysql_field_count(MYSQL *mysql);
unsigned int mysql_num_fields(MYSQL_RES *result);
/*获得结果集的行数*/
my_ulonglong mysql_num_rows(MYSQL_RES *result);
/*使用完结果集后一定要记得释放*/
void mysql_free_result(MYSQL_RES *result);
/*如果执行的SQL语句是无返回结果的,比如DELETE INSERT等,可以使用以下函数获取影响行数*/
my_ulonglong mysql_affected_rows(MYSQL *mysql);
/*最后使用完连接后需要释放*/
void mysql_close(MYSQL *mysql);
/*错误处理*/
/*MYSQL的函数基本都遵循C语言的编程习惯,当返回值为整数时,0代表成功,非0代表失败,当返回指针时,NULL代表失败*/
/*如果函数执行失败,你可以通过下列函数获得信息*/
unsigned int mysql_errno(MYSQL *mysql);//错误代号
const char *mysql_error(MYSQL *mysql);//英文错误信息
mysql_real_connect函数的原型如下:
MYSQL * STDCALL mysql_real_connect(MYSQL *mysql, const char *host,const char *user,const char *passwd,const char *db,unsigned int port,const char *unix_socket,unsigned long clientflag);
参数释义:
mysql:前面定义的MYSQL变量; host:MYSQL服务器的地址; user:登录用户名; passwd:登录密码; db:要连接的数据库; port:MYSQL服务器的TCP服务端口; unix_socket:unix连接方式,为NULL时表示不使用socket或管道机制; clientflag:Mysql运行为ODBC数据库的标记,一般取0。
连接失败时该函数返回0。
mysql_real_query函数的原型如下:
int STDCALL mysql_real_query(MYSQL *mysql, const char *q, unsigned long length);
参数释义:
mysql:前面定义的MYSQL变量; q:SQL查询语句; length:查询语句的长度。
查询成功则该函数返回0。
两个函数的原型分别为:
MYSQL_RES * STDCALL mysql_store_result(MYSQL *mysql);
MYSQL_RES * STDCALL mysql_use_result(MYSQL *mysql);
这两个函数分别代表了获取查询结果的两种方式。
第一种,调用mysql_store_result函数将从Mysql服务器查询的所有数据都存储到客户端,然后读取;
第二种,调用mysql_use_result初始化检索,以便于后面一行一行的读取结果集,而它本身并没有从服务器读取任何数据,这种方式较之第一种速度更快且所需内存更少,但它会绑定服务器,阻止其他线程更新任何表,而且必须重复执行mysql_fetch_row读取数据,直至返回NULL,否则未读取的行会在下一次查询时作为结果的一部分返回。
故经常我们使用mysql_store_result。
上述两种方式最后都是重复调用mysql_fetch_row函数读取数据。mysql_fetch_row函数的原型如下:
MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result);
参数释义:
result就是mysql_store_result或mysql_use_result的返回值。
该函数返回MYSQL_ROW型的变量,即字符串数组,假设为row,则row[i]为第i个字段的值。当到结果集尾部时,此函数返回NULL。
mysql_free_result函数的原型如下:
void STDCALL mysql_free_result(MYSQL_RES *result);
void STDCALL mysql_close(MYSQL *sock);
就是个实例,也不是我写的,我也是刚入门。
#include <WinSock2.h>
#include <mysql.h>
#include <iostream>
#pragma comment(lib, “libmysql.lib”)
using namespace std;
int main(){
MYSQL mysql;
MYSQL_RES *res;
MYSQL_ROW row;
// 初始化MYSQL变量
mysql_init(&mysql);
// 连接Mysql服务器,本例使用本机作为服务器。访问的数据库名称为“msyql”,参数中的user为你的登录用户名,***为登录密码,需要根据你的实际用户进行设置
if (!mysql_real_connect(&mysql, “127.0.0.1”, “user”, “123”, “mysql”, 3306, 0, 0)){
cout << “mysql_real_connect failure!” << endl;
return 0;
}
// 查询mysql数据库中的user表
if (mysql_real_query(&mysql, “select * from user”, (unsigned long)strlen(“select * from user”)))
{
cout << “mysql_real_query failure!” << endl;
return 0;
}
// 存储结果集
res = mysql_store_result(&mysql);
if (NULL == res)
{
cout << “mysql_store_result failure!” << endl;
return 0;
}
// 重复读取行,并输出第一个字段的值,直到row为NULL
while (row = mysql_fetch_row(res))
{
cout << row[0] << endl;
}
// 释放结果集
mysql_free_result(res);
// 关闭Mysql连接
mysql_close(&mysql);
return 0;
}
本篇也是本次入门之旅的最后一篇,之后更要多加练习