MYSQL数据库(MYSQL教程,MYSQL操作,MYSQL连接(函数调用)(让MySql支持中文字符))
1.MYSQL教程:
1.1:对mysql数据库的了解:
Mysql是最流行的关系型数据库管理系统
1.2:mysql数据库在ubuntu下的安装:
安装:
1.服务器的安装:
apt-get install mysql-server
== 注==:自己指定用户名(root)和密码
2.客户端的安装:
apt-get install mysql-client
3 . 开发包的安装:
apt-get install libmysqlclient-dev
安装结果检测:
netstat -tap | grep mysql
状态查询:
service mysql status
启动:
service mysql start
关闭:
service mysql stop
mysql终端提示符所代表的含义:
1.3:mysql数据类型:
2 .mysql的相关操作:
2.1:与mysql建立连接:
登录:
mysql -p
退出:
exit;
修改密码:
即:修改root的密码:
set password for '用户名'@'主机名' = '新的密码';
set password = '新密码';----为当前登录用户修改密码
清屏:
system clear;
2.2:mysql数据库在终端的基本操作:
显示已有的数据库:
show databases;
如何自己创建一个数据库:
create database xxx;
选择数据库:
use dbname;---dbname为选择的数据库名
使用数据库:
use 数据库名;
查看数据库中的表:
show tables;
创建表:
注意:Atablemusthaveatleast1column
create table表名(列名类型,列名类型....);
//create table report(user varchar(20),passwd int);
查看表的结构:
describe 表名;
显示表的内容:
select *from 表名;----显示表中所有的内容
//*代表显示全部内容,可以用列名代替*,显示一列
select name, age from 表名;
//select*from表名;显示表中所有的内容
//select列名1,列名2 from 表名;显示具体某一列的
显示表的框架:
show columns from 表名 from 数据库;//显示所有列/
//show columns from database.table;//等同
describe 表名;//显示表的框架
向表中填入信息:
insert into 表名 values (值);
//mysql> insert into 表格 values("dazai",123);
复制表格:
insert into tablename (col1,col2) select col,col3 from
dbname.tablename2;//复制过来往后排
//示例:into report (user,passwd) select name,age from
test.infor;
批量导入将文件中的信息导入表中:
注意:文件必须是.txt结尾不同列之间用tab.
load data local infile ‘文件路径’ intotable 表名
//示例:load data local infile '/home/dazai/usr.txt'into table 表格;
修改表的内容:
update 表名 set 要修改的内容 where 条件;
//示例:update 表格 set dazai = 'zhongye' where 密码 = 123;
删除表的内容:
delete from 表名 where 条件1 and/or 条件2;
//示例:delete from 表格 where 用户="哒宰" and 密码 = 123;
示例:delete from report where passwd > 100;
//删除passwd>100所有行
delete from report where user ="hello" orpasswd=
123;
//满足user是hello或者passwd是123都删除
:
改索引:
添加列:
//alter tabel 表名 add 列名类型
//示例:
alter table 表格 add sex char;
修改列类型:
alter table 表名 modify 列名 新类型
//示例:
alter table 表格 modify passwd int(4);
删除列:
alter table 表名 drop 列名;
//示例:
alter table 表格 drop sex;
排序:
//示例:
select * from 表格 order by 密码 desc;
//按照密码降序排列,也能仅显示用户这一列
升序排序,如下图:
3:MYSQL连接:C语言API类型:
3.1:mysql_real_connect()函数:
描述:
mysql_real_connect()尝试与运行在主机上的MySQL数据库引擎建立连接。在你能够执行需要有效MySQL连接句柄结构的任何其他API函数之前,mysql_real_connect()必须成功完成。
函数原型:
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)
函数形参:
1个参数应是已有MYSQL结构的地址。调用mysql_real_connect()之前,必须调用mysql_init()来初始化MYSQL结构。
mysql_init(MYSQL *mysql);
//MYSQL *mysql
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;
// 非缓冲的时候用到
MYSQL_ROW current_row; //mysql_store_result时会用到。当前行
unsigned long *lengths;
//每列的长度
MYSQL *handle;
// mysql_use_result会用。
my_bool eof; //是否为行尾
} MYSQL_RES;
“host”的值必须是主机名或IP地址。如果“host”是NULL或字符串"localhost",连接将被视为与本地主机的连接。如果操作系统支持套接字(Unix)或命名管道(Windows),将使用它们而不是TCP/IP连接到服务器。
“user”参数包含用户的MySQL登录ID。
“passwd”参数包含用户的密码。
“db”是数据库名称。如果db为NULL,连接会将默认的数据库设为该值。
如果“port”不是0,其值将用作TCP/IP连接的端口号。注意,“host”参数决定了连接的类型。
unix_socket默认NULL,
client_flag的值通常为0
返回值:
失败返回NULL,成功返回与第一个参数相同的值
注意事项:
写代码的时候需要添加==“mysql.h”==
编译的时候需要添加以下内容
-I(大写的i)/usr/include /mysql
-l(小写的L)mysqlclient
//指定使用的mysql.h头文件的路径以及使用的libmysqlclient.a(.so)库
如果编辑的时候使用的头文件是**“mysql/mysql.h”**,
编译的时候不需要加-I(大写的i)选项
3.2:mysql_real_query()函数:
描述:
执行由“query”指向的SQL查询,是字符串长度字节“long”。字符串必须包含1条SQL语句,而且不应为语句添加终结分号(‘;’)或“\g”。如果允许多语句执行,字符串可包含由分号隔开的多条语句
原型:
int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length)
形参:
query指向的SQL查询
length个字节的字符串
返回值:
成功零。错误非零。
3.3:mysql_store_result()函数:
描述:
将查询的结果读取到客户端,置于分配的MYSQL_RES结构中。
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;
// 非缓冲的时候用到
MYSQL_ROW current_row; //mysql_store_result时会用到。当前行
unsigned long *lengths;
//每列的长度
MYSQL *handle;
// mysql_use_result会用。
my_bool eof; //是否为行尾
} MYSQL_RES;
函数原型:
MYSQL_RES *mysql_store_result(MYSQL *mysql)
形参:
已有MYSQL的地址:
返回值:
MYSQL_RES结果集合,错误返回NULL。
相关联的函数:
mysql_num_fields()函数:
描述:
获取结果集中的列的数目
原型:
unsigned int mysql_num_fields(MYSQL_RES* res)
形参:
见上面说明
返回值:
返回结果集中的列的数目
mysql_num_rows()函数:
描述:
返回一个结果集合中的行的数量
原型:
my_ulonglong mysql_num_rows(MYSQL_RES *result)
形参:
见上面说明
返回值:
结果集中的行数(+1)
mysql_fetch_row()函数:
描述:
检索结果集的下一行
原型:
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
形参:
见上面说明
返回值:
成功返回结果集中下一行指针,否则NULL或错误码
mysql_fetch_field()函数:
描述:
返回一个MYSQL_FIELD 结构的一个结果集合的一个列的定义。重复调用这个函数在结果集合中检索所有关于列的信息。当没有剩下更多的字段时,mysql_fetch_field () 返回NULL
原型:
MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result)
返回值结构体:
返回值:
当前列的MYSQL_FIELD 结构。如果没有列剩下,NULL
mysql_fetch_lengths()函数:
描述:
结果集内当前行的列长度
原型:
unsigned long *mysql_fetch_lengths(MYSQL_RES *result)
形参:
见上面说明;
返回值:
无符号长整数的数组表示各列的大小(不包括任何终结NULL字符)。如果出现错误,返回NULL
mysql_errno()函数:
描述:
返回最近被调用的MySQL函数的出错消息
原型:
const char* mysql_error(MYSQL* mysql)
形参:
见上面说明
返回值:
返回最近一次调用失败的错误消息(返回的是字符串消息)
3.3:mysql_free_result()函数:
描述:
释放由mysql_store_result()、mysql_use_result()、mysql_list_dbs()等为结果集分配的内存。
完成对结果集的操作后,必须调用mysql_free_result()释放结果集使用的内存。
原型:
void mysql_free_result(MYSQL_RES *result)
形参:
见上面说明;
返回值: 无;
3.4:mysql_close()函数:
描述:
关闭前面打开的连接。如果句柄是由mysql_init()或mysql_connect()自动分配的,mysql_close()还将解除分配由mysql指向的连接句柄。
原型:
void mysql_close(MYSQL *mysql)
形参:
见上面说明;
返回值: 无;
代码案例演示:
mysql.c
#include <stdio.h>
#include <mysql/mysql.h>
#include <string.h>
int main()
{
MYSQL Test;//定义MYSQL变量
MYSQL_ROW res_row;//
unsigned long *len = NULL;
mysql_init(&Test);//chushihua
if(mysql_real_connect(&Test,"localhost","root","liu...","mysql2",0,NULL,0) == NULL){
printf("连接失败\n");
return -1;
}
printf("mysql 连接成功\n");
char name[20]={0};
printf("请输入用户名\n");
scanf("%s",name);
//char buf[300]="create table infor(user varchar(20),passwd int(4))";//1.创建表格
//char buf[300]="insert into infor values('哒宰',999)";
//插入数据
//char buf[300]="select * from infor";//无法显示
char buf[300]="select passwd from infor where user = ";
//查看相关用户的密码
sprintf(buf,"%s '%s'",buf,name);//命令写入buf
printf("buf = %s\n",buf);
if(mysql_real_query(&Test,buf,strlen(buf)) != 0)
//执行命令行
{
perror("query");//失败
return -1;
}
printf("语句执行成功\n");
MYSQL_RES *res = NULL;//定义返回值
res = mysql_store_result(&Test);//存放结果
if(res == NULL)
printf("函数执行失败\n");//表格内容位空
else{
printf("存在用户\n");
unsigned int field = mysql_num_fields(res);//返回列
unsigned int row = mysql_num_rows(res);//返回行
printf("查询结果有%u行 %u列\n",row,field);//打印结果
if(row == 0)
{
printf("没有该用户\n");
}
else{
while(res_row=mysql_fetch_row(res))
{
len = mysql_fetch_lengths(res);//内容长度
for(int i=0;i<field;i++)//按列查询
{
printf("用户在第 %u 列,密码 is %s,密码lenth is %lu\n",i,res_row[i],*(len+i));
}
}
}
}
return 0;
}
代码说明:
通过程序连接数据库,并在数据库里面创建表格,插入数据。
并通过输入用户的名字,查询用户的密码等相关信息。
运行结果:
数据库:
终端:
补充:
让MySql支持中文字符
在下图路径的文件中:
用root权限下进行在终端改动:
第一个文件debian.cnf下添加:
[client] 里面添加:
default-character-set = utf8
[mysql] 里面添加:
default-character-set = utf8
在第二个文件mysql.conf.d文件中mysqld.cnf下添加:
[mysqld] 里面添加:
character-set-client-handshake = FALSE
character-set-server = utf8
collation-server = utf8_unicode_ci
init_connect=’SET NAMES utf8
参考流程图:
数据库
注:需要使用xmind进行查看。