sudo apt-get update
sudo apt-get install mysql-server-5.
//根据写入的正则版本号选定版本安装
sudo apt-get install mysql-server-5.6
//进入安装界面之后 输入root密码进行安装
mysql -u root -p //输入此行代码进入mysql编辑界面
// 按\c清除代码行按\h呼出帮助 退出需要在新的命令行的第一个输入exit退出 建议配合\c食用
//注在mysql中每一句都要加上;
show databases; //查看数据库
use mysql //进入数据库
show tables //进入数据库中查看所有表
使用Mysqlworkbench软件进行连接
点击这个按钮进行创建
填写你的服务器IP地址
测试链接
点击测试链接后报错 在Linux中发现端口未开启 且服务器地址是回环地址 修改如下
nmap -p <port> <ip_address> 进行端口查看是否开启
在Linux中的 etc/mysql/my.cnf 中找到
这行把后面的IP地址改成0.0.0.0 意味着任何IP都可以访问
同时若是同一个物理服务器中启动了多个服务器这时候就需要更改端口号来实现同时访问
修改地址后重启命令是
sudo /etc/init.d/mysql restart
改完IP之后 再次测试链接发现服务器限制root账户登录
进入到数据库中的user表中修改
select Host ,user from user where User = 'root' ;//查看root的信息
//这边建议不要修改root的信息 而是重新写一个用户去使用
创建用户
create user 'admin'@'%' identified by '123456';
创建完毕之后使用
select Host ,user from user;命令查看一下是否创建
然后返回workbench中将root的账号密码替换成admin
再次链接测试发现成功点击ok完成创建
MySQL的使用
赋予远程链接的增删改查的权限
//模板
grant all privileges on 库名.表名 to '用户名'@'IP地址' identified by '密码' with grant option;
flush privileges;
//使用user在任何主机上远程联机
GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' IDENTIFIED BY 'mypwd' WITH GRANT OPTION;
FLUSH PRIVILEGES;
//使用user在固定ip上联机
GRANT ALL PRIVILEGES ON *.* TO 'user'@'192.168.1.3' IDENTIFIED BY 'mypwd' WITH GRANT OPTION;
FLUSH PRIVILEGES;
//注:以上代码均在安装MySQL的机器上输入
//实际操操作中
grant all privileges on *.* to 'admin'@'%';
注:实际应用中多为为不同的角色设置不同的权限.
//创建数据库
create database xxx_db;
//删除数据库
drop database king_db;
要是想在Linux中执行代码中的sql语句需要安装客户端
sudo apt-get install libmysqlclient-dev
c文件中需要引入mysql的头文件
#include <mysql.h>
MYSQL mysql; //sql对象定义
mysql_error(&mysql) //sql中的异常信抛出
mysql_init(&mysql) //sql初始化 非0为成功
mysql_real_connect(&mysql,ip,username,password,definedb,port,NULL,0) /sql链接函数
第一个参数是定义的数据库对象 第二个是IP地址 三四是用户名和密码 第五个是默认链接数据库名 第六个是端口号 七八置空 非0为成功
mysql_real_query(&mysql, SQL语句, strlen(SQL语句)); //sql语句执行函数 0为成功
mysql_close(&mysql) //sql端口关闭(必须执行的函数)
mysql_store_result(mysql) //将查询语句的结果返回
MYSQL_RES *res = mysql_store_result(mysql); //保存返回语句的内容
mysql_num_rows(res) //获取返回数据的行数
mysql_num_fields(res) //获取返回数据的列数
MYSQL_ROW row //创建一个数组 类似于sqlread();
//关于如何读取数据
while ((row = mysql_fetch_row(res))) //判断行是否为空
{
int i = 0;
for (i = 0; i < cows; i++)
{
printf("%s \t",row[i]);
}
printf("\n");
}
mysql_free_result(res); //释放掉res
//Linux中编译
gcc mysql.c -o mysql -I /usr/include/mysql/ -lmysqlclient
查询数据以及读取数据
1.向DB服务器发送SQL语句
2.存储服务器发送过来的数据内容
3.判断结果的行列
4.抓取数据
//第一步
if (mysql_real_query(sqldata, SQL_SELECT_TB_USER, strlen(SQL_SELECT_TB_USER)))
{
printf("SQL_SELECT :%s \n ", mysql_error(sqldata));
}
//第二步
MYSQL_RES *res = mysql_store_result(sqldata);保存返回语句的内容
if (res == NULL)
{
printf("mysql_store_result: %s \n",mysql_error(sqldata));
return -2;
}
//第三步 判断数据集合的行数
int rows = mysql_num_rows(res);
printf("Rows :%d \n",rows);
//列数
int cows = mysql_num_fields(res);
printf("Cows :%d \n", cows);
//第四步 将返回的数据逐行取出
MYSQL_ROW row; //row是一个存放数据的数组类似于C#中的sqlread函数
while ((row = mysql_fetch_row(res))) //判断行是否为空
{
int i = 0;
for (i = 0; i < cows; i++)
{
printf("%s \t",row[i]);
}
printf("\n");
}
mysql_free_result(res);
return 0;
删除数据
在mysql中删除数据涉及到一个安全模式 该模式必须要在删除条件中加入主键才能执行语句为了避免安全模式的妨碍一般会在执行语句前后分别开关一下安全模式
SET SQL_SAFE_UPDATES = 0; //关闭安全模式
DELETE FROM TB_USERS WHERE U_NAME = 'yang'//执行的SQL语句段
SET SQL_SAFE_UPDATES = 1; //开启安全模式
为了避免多次在代码中反复调用SET采取存储过程来实现
DELIMITER $$
CREATE PROCEDURE PROC_xxxx_xxxx(IN U_NAME VARCHAR(32))
BEGIN
...
...
...
END $$
CALL PROC_xxxx_xxxx('....'); //传入参数调用存储过程
drop procedure PROC_xxxx_xxxx; //删除存储过程
//存储过程类似于程序中的方法 传入参数执行内容 ##代表存储过程从哪里开始从哪里结束 前后要加标识
程序中使用是通过SQL中预定义的存储过程去传参调用完成
#include <stdio.h>
#include <mysql.h>
#include <string.h>
//C U R D
//创建 更新 读取 删除
#define yang_db_server_ip "192.168.126.132" //数据库IP
#define yang_db_server_port 3306 //数据库链接的端口号
#define yang_db_server_definedb "yang_db" //该用户默认链接的数据库
#define yang_db_server_username "admin" //用户名
#define yang_db_server_password "123456" //密码
#define SQL_INSERT_TB_USER "insert TB_USER(UNAME,USEX) value('yang','masn');" //增加语句
#define SQL_SELECT_TB_USER "SELECT * FROM TB_USER;" //查询语句
#define SQL_CALL_PROC_TB_USER "CALL PROC_DELETE_TBUSER('sun')" //调用删除的存储过程
int sel(MYSQL* sqldata)
{
//第一步
if (mysql_real_query(sqldata, SQL_SELECT_TB_USER, strlen(SQL_SELECT_TB_USER)))
{
printf("SQL_SELECT :%s \n ", mysql_error(sqldata));
}
//第二步
MYSQL_RES* res = mysql_store_result(sqldata);保存返回语句的内容
if (res == NULL)
{
printf("mysql_store_result: %s \n", mysql_error(sqldata));
return -2;
}
//第三步 判断数据集合的行数
int rows = mysql_num_rows(res);
printf("Rows :%d \n", rows);
//列数
int cows = mysql_num_fields(res);
printf("Cows :%d \n", cows);
//第四步 将返回的数据逐行取出
MYSQL_ROW row; //row是一个存放数据的数组类似于C#中的sqlread函数
while ((row = mysql_fetch_row(res))) //判断行是否为空
{
int i = 0;
for (i = 0; i < cows; i++)
{
printf("%s \t", row[i]);
}
printf("\n");
}
mysql_free_result(res);
return 0;
//goto Exit;
}
int main()
{
//注:mysql的两个接口以返回0作为失败
MYSQL mysql;
if (NULL == mysql_init(&mysql)) //初始化数据库
{
printf("mysql_init :%s \n", mysql_error(&mysql)); //mysql提供了统一的错误值
return -1;
}
//mysql_real_connect返回非0成功
if (!mysql_real_connect(&mysql, yang_db_server_ip,
yang_db_server_username, yang_db_server_password,
yang_db_server_definedb, yang_db_server_port, NULL, 0))//第一个参数是定义的数据库对象 第二个是IP地址 三四是用户名和密码 第五个是默认链接数据库名 第六个是端口号 七八置空
{
printf("mysql_real_connect:%s \n", mysql_error(&mysql));
}
#if 1
sel(&mysql);
#endif
#if 0
//insert----SQL
//mysql_real_query返回0成功
if (mysql_real_query(&mysql, SQL_INSERT_TB_USER, strlen(SQL_INSERT_TB_USER)))
{
printf("mysql_real_query :%s \n ", mysql_error(&mysql));
}
#endif
#if 0
printf("case : mysql --> delete \n");
//delete----SQL
//mysql_real_query返回0成功
if (mysql_real_query(&mysql, SQL_CALL_PROC_TB_USER, strlen(SQL_CALL_PROC_TB_USER)))
{
printf("mysql_real_query :%s \n ", mysql_error(&mysql));
}
#endif
#if 1
sel(&mysql);
#endif
mysql_close(&mysql);
return 0;
}