MySQL基础及MySQL C API编程
Posted nobcaup
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL基础及MySQL C API编程相关的知识,希望对你有一定的参考价值。
MySQL基础及MySQL C API编程
一、MySQL For Windows安装:
1. 下载:
上官网下载即可:
http://www.mysql.com/downloads/
2. 安装:
没有什么好说的,傻瓜式,也没有什么要注意的。
3. 配置:
添加系统变量mysql_HOME和修改PATH,目的就是让系统默认能够找到MySQL命令。(安装目录的/bin下面)
PS:
补充一下,有的朋友可能下载的是免安装版本,拷贝到一个地方就可以了,这个时候,配置还是需要的,但是配置完成之后,需要手动安装MySQL服务。因为我们是想既要搭建MySQL服务器端,又要搭建MySQL客户端,服务器端是需要开启服务的,所以需要手动安装并启动mysql服务。还有就是要注意,网上的一些WAMP集成安装包,只包含了SQL web有关的工具,是不全的,需要安装200多M的那个版本。
相关的几个命令如下:
mysqld -install //安装mysql服务
mysqld -remove //卸载mysql服务
net start mysql //启动mysql服务
net stop mysql //停止mysql服务
mysqladmin -version //查看mysql服务是否安装成功
也可以通过Windows的服务工具来配置MySQL。
二、MySQL基础:
1. 连接MySQL:
首先再明确一个概念,现在我们是在学习如何使用MySQL,我们的MySQL服务器端是安装在本机上,MySQL客户端也是安装在本机上的。我们登录MySQL就是通过CMD命令行工具,用客户端命令mysql登录到本机MySQL服务器端,本机开启的服务是MySQL,进程是mysql.exe。
安装完成之后,默认的Host和User是:
其中密码都为空。
我们有两种方式连接mysql服务器,不指定Host/User/Password默认就是按照localhost匿名用户的方式连接。
退出的mysql服务器使用命令exit或者quit。
mysql //localhost+匿名方式登录
mysql -u root -p //localhost+root+password方式登录
exit //退出mysql服务器
2. 修改mysql服务器用户密码:
mysqladmin -u root -p password //中间提示输入当前密码一次,新密码两次
3. MySQL基础语法:
- 1.创建数据库,名字为RUNOOB
mysqladmin -u root -p create RUNOOB
- 2.删除数据库,名字为RUNOOB
mysqladmin -u root -p drop RUNOOB
- 3.显示数据库:
mysql> show databases; //注意后面要加;号,表示一条mysql语句结束
- 4.选择数据库:
mysql> use RUNOOB;
- 5.数据类型:
http://www.runoob.com/mysql/mysql-data-types.html
- 6.显示当前数据库下的数据表:
mysql> show tables;
- 7.创建数据表:
mysql> CREATE TABLE runoob_tbl(
-> runoob_id INT NOT NULL AUTO_INCREMENT,
-> runoob_title VARCHAR(100) NOT NULL,
-> runoob_author VARCHAR(40) NOT NULL,
-> submission_date DATE,
-> PRIMARY KEY ( runoob_id )
-> );
- 8.删除数据表:
mysql> DROP TABLE runoob_tbl
- 9.插入数据:
mysql> INSERT INTO runoob_tbl
->(runoob_title, runoob_author, submission_date)
->VALUES
->("Learn php", "John Poul", NOW());
- 10.查询数据表中的数据:
SELECT * from runoob_tbl
- 11.Show有关的语法:
SHOW DATABASES; //列出 MySQL Server上的数据库
SHOW TABLES [FROM db_name]; //列出数据库中的表
SHOW TABLE STATUS [FROM db_name]; //列出数据库的表信息,比较详细
SHOW COLUMNS FROM tbl_name [FROM db_name]; //列出表的列信息,同 SHOW FIELDS FROM tbl_name [FROM db_name],DESCRIBE tbl_name [col_name]
SHOW FULL COLUMNS FROM tbl_name [FROM db_name]; //列出表的列信息,比较详细,同 SHOW FULL FIELDS FROM tbl_name [FROM db_name]
SHOW INDEX FROM tbl_name [FROM db_name]; //列出表的索引信息
SHOW STATUS; //列出 Server 的状态信息
SHOW VARIABLES; //列出 MySQL 系参数值
SHOW PROCESSLIST; //查看当前mysql查询进程
SHOW GRANTS FOR user; //列出用户的授权命令
- 12.where子句:
mysql> SELECT * from runoob_tbl WHERE runoob_author='Sanjay'; //查询某一个符合条件的表项
- 13.update查询:
//查询并修改表中的一项,最后更新表格
mysql> UPDATE runoob_tbl
-> SET runoob_title='Learning JAVA'
-> WHERE runoob_id=3;
- 14.delete语句:
mysql> DELETE FROM runoob_tbl WHERE runoob_id=3; //删除表中的某一项
- 15.ALTER命令:
mysql> ALTER TABLE testalter_tbl DROP i; //删除以上表的 i 字段
mysql> ALTER TABLE testalter_tbl ADD i INT; //在表 testalter_tbl 中添加 i 字段,并定义数据类型
mysql> ALTER TABLE testalter_tbl MODIFY c CHAR(10); //把字段 c 的类型从 CHAR(1) 改为 CHAR(10)
mysql> ALTER TABLE testalter_tbl
-> MODIFY j BIGINT NOT NULL DEFAULT 100; //指定字段 j 为 NOT NULL 且默认值为100
mysql> ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000; //使用 ALTER 来修改字段的默认值
mysql> ALTER TABLE testalter_tbl ALTER i DROP DEFAULT; //使用 ALTER 命令及 DROP子句来删除字段的默认值
mysql> ALTER TABLE testalter_tbl RENAME TO alter_tbl; //修改表名
- 16.正则表达式:
正则表达式是通用的,和C、linux shell一样的。
mysql> SELECT name FROM person_tbl WHERE name REGEXP '^st'; //查找name字段中以'st'为开头的所有数据
mysql> SELECT name FROM person_tbl WHERE name REGEXP 'ok$'; //查找name字段中以'ok'为结尾的所有数据
mysql> SELECT name FROM person_tbl WHERE name REGEXP 'mar'; //查找name字段中包含'mar'字符串的所有数据
mysql> SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$'; //查找name字段中以元音字符开头且以'ok'字符串结尾的所有数据
4. MySQL键和索引的概念:
http://www.runoob.com/mysql/mysql-index.html
http://blog.csdn.net/duck_arrow/article/details/8264686
http://www.jb51.net/article/34037.htm
三、MySQL C API编程:
实质就是C语言调用libmysql.lib库,使用其提供的的函数来连接,访问,修改MySQL数据库中的内容。
1. MYSQL结构体:
这个结构主要用于连接,保存一些连接的信息。
typedef struct st_mysql {
NET net; /* Communication parameters */
gptr connector_fd; /* ConnectorFd for SSL */
char *host,*user,*passwd,*unix_socket,
*server_version,*host_info,*info,*db;
unsigned int port,client_flag,server_capabilities;
unsigned int protocol_version;
unsigned int field_count;
unsigned int server_status;
unsigned long thread_id; /* Id for connection in server */
my_ulonglong affected_rows;
my_ulonglong insert_id; /* id if insert on table with NEXTNR */
my_ulonglong extra_info; /* Used by mysqlshow */
unsigned long packet_length;
enum mysql_status status;
MYSQL_FIELD *fields;
MEM_ROOT field_alloc;
my_bool free_me; /* If free in mysql_close */
my_bool reconnect; /* set to 1 if automatic reconnect */
struct st_mysql_options options;
char scramble_buff[9];
struct charset_info_st *charset;
unsigned int server_language;
} MYSQL;
2. MYSQL_RES结构体:
这个结构主要是返回一些操作数据库(SELECT, SHOW, DESCRIBE, EXPLAIN等)的结果,即“数据集”。
typedef struct st_mysql_res {
my_ulonglong row_count;
unsigned int field_count, current_field;
MYSQL_FIELD *fields;
MYSQL_DATA *data;
MYSQL_ROWS *data_cursor;
MEM_ROOT field_alloc;
MYSQL_ROW row; /* If unbuffered read */
MYSQL_ROW current_row; /* buffer to current row */
unsigned long *lengths; /* column lengths of current row */
MYSQL *handle; /* for unbuffered reads */
my_bool eof; /* Used my mysql_fetch_row */
} MYSQL_RES;
3. MySQL C API编程步骤:
具体有哪些函数,可以到网上搜索一下相关介绍,这里讲一下编程步骤:
(1)、首先我们要包含mysql的头文件,并链接mysql动态库。即添加以下语句:
#include <WinSock2.h> // 进行网络编程需要winsock2.h
#include <mysql.h>
#pragma comment(lib, "libmysql.lib")
(2)、创建MYSQL变量。如:
MYSQL mysql;
(3)、初始化MYSQL变量。
mysql_init(&mysql);
(4)、调用mysql_real_connect函数连接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。
(5)、调用mysql_real_query函数进行数据库查询。mysql_real_query函数的原型如下:
int STDCALL mysql_real_query(MYSQL *mysql, const char *q, unsigned long length);
参数说明:mysql--前面定义的MYSQL变量;q--SQL查询语句;length--查询语句的长度。
查询成功则该函数返回0。
(6)、通过调用mysql_store_result或mysql_use_result函数返回的MYSQL_RES变量获取查询结果数据。
两个函数的原型分别为:
MYSQL_RES * STDCALL mysql_store_result(MYSQL *mysql);
MYSQL_RES * STDCALL mysql_use_result(MYSQL *mysql);
这两个函数分别代表了获取查询结果的两种方式。第一种,调用端,然后读取;第二种,调用mysql_use_result初始化检索,以便于后面一行一行的读取结果集,而它本身并没有从服务器读取任何数据,这种方式较之第一种速度更快且所需内存更少,但它会绑定服务器,阻止其他线程更新任何表,而且必须重复执行mysql_fetch_row读取数据,直至返回NULL,否则未读取的行会在下一次查询时作为结果的一部分返回,故经常我们使用mysql_store_result。
(7)、调用mysql_fetch_row函数读取结果集数据。
上述两种方式最后都是重复调用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。
(8)、结果集用完后,调用mysql_free_result函数释放结果集,以防内存泄露。mysql_free_result函数的原型如下:
void STDCALL mysql_free_result(MYSQL_RES *result);
(9)、不再查询Mysql数据库时,调用mysql_close函数关闭数据库连接。mysql_close函数的原型为:
void STDCALL mysql_close(MYSQL *sock);
4. MySQL C API编程例子:
#if defined(_WIN32) || defined(_WIN64) //为了支持windows平台上的编译
#include <windows.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include "mysql.h" //我的机器上该文件在/usr/local/include/mysql下
//定义数据库操作的宏,也可以不定义留着后面直接写进代码
#define SELECT_QUERY "select username from tbb_user where userid = %d"
int main(int argc, char **argv) //char **argv 相当于 char *argv[]
{
MYSQL mysql,*sock; //定义数据库连接的句柄,它被用于几乎所有的MySQL函数
MYSQL_RES *res; //查询结果集,结构类型
MYSQL_FIELD *fd ; //包含字段信息的结构
MYSQL_ROW row ; //存放一行查询结果的字符串数组
char qbuf[160]; //存放查询sql语句字符串
if (argc != 2) { //检查输入参数
fprintf(stderr,"usage : mysql_select <userid>\\n\\n");
exit(1);
}
mysql_init(&mysql);
if (!(sock = mysql_real_connect(&mysql,"localhost","dbuser","dbpwd","9tmd_bbs_utf8",0,NULL,0))) {
fprintf(stderr,"Couldn't connect to engine!\\n%s\\n\\n",mysql_error(&mysql));
perror("");
exit(1);
}
sprintf(qbuf,SELECT_QUERY,atoi(argv[1]));
if(mysql_query(sock,qbuf)) {
fprintf(stderr,"Query failed (%s)\\n",mysql_error(sock));
exit(1);
}
if (!(res=mysql_store_result(sock))) {
fprintf(stderr,"Couldn't get result from %s\\n", mysql_error(sock));
exit(1);
}
printf("number of fields returned: %d\\n",mysql_num_fields(res));
while (row = mysql_fetch_row(res)) {
printf("Ther userid #%d 's username is: %s\\n", atoi(argv[1]),(((row[0]==NULL)&&(!strlen(row[0]))) ? "NULL" : row[0])) ;
puts( "query ok !\\n" ) ;
}
mysql_free_result(res);
mysql_close(sock);
exit(0);
return 0; //. 为了兼容大部分的编译器加入此行
}
最后看一个例子,另一个网友VS2015 C连接MySQL的实现:
VS2015连接mySQL数据库
以上是关于MySQL基础及MySQL C API编程的主要内容,如果未能解决你的问题,请参考以下文章