目录
关系型与非关系型数据库
关系型数据库是一种基于关系模型的数据库管理系统(DBMS)。在关系型数据库中,数据被组织成表(Table),每个表由行(Row)和列(Column)组成。行表示具体的数据记录,列表示数据的属性或字段。
关系型数据库的特点包括:
-
结构化数据:关系型数据库中的数据以结构化的方式存储,每个表都有固定的列和数据类型,使得数据具有一定的规范性和一致性。
-
数据之间的关系:不同的表可以通过主键和外键建立关系,以实现数据之间的关联和引用。这种关系可以用于查询和处理数据,实现数据的一致性和完整性。
-
SQL语言支持:关系型数据库使用结构化查询语言(SQL)进行数据管理和操作。SQL是一种标准化的语言,可以用于创建、查询、更新和删除数据库中的数据。
-
ACID事务:关系型数据库支持ACID(原子性、一致性、隔离性和持久性)事务,确保数据的完整性和一致性。
-
数据库管理系统:关系型数据库通常由一个数据库管理系统(DBMS)来管理和操作。常见的关系型数据库管理系统包括Oracle、MySQL、Microsoft SQL Server、PostgreSQL等。
关系型数据库在许多应用领域具有广泛的应用,特别是对于需要高度结构化、规范化和数据一致性的应用场景,如企业级应用、电子商务、金融系统等。然而,随着非关系型数据库(NoSQL)的兴起,针对大数据、高并发和分布式环境等特殊需求,开发人员也可以选择其他类型的数据库来满足不同的业务需求。
非关系型数据库(NoSQL)是一类与传统关系型数据库不同的数据库管理系统(DBMS)。它们不使用传统的表格结构和SQL语言,而是使用其他数据模型和查询语言,以满足不同类型的数据存储和处理需求。
非关系型数据库的特点包括:
-
数据模型多样性:非关系型数据库支持多种数据模型,如键值对(Key-Value)、文档型(Document)、列族型(Column Family)和图形(Graph),每种模型都适用于不同的数据存储和查询需求。
-
高可扩展性:非关系型数据库通常具有良好的可扩展性,可以在分布式环境中进行水平扩展,以适应大规模数据和高并发访问。
-
灵活的数据结构:与关系型数据库的固定列结构不同,非关系型数据库允许存储不同结构或半结构化的数据,无需事先定义表结构。
-
高性能和低延迟:非关系型数据库通常采用高性能的存储引擎和并行计算方式,以实现快速的数据存取和查询。
-
弱一致性:非关系型数据库中的数据一致性要求相对较低,通常采用最终一致性(Eventual Consistency)的策略,以提高系统的可用性和性能。
常见的非关系型数据库包括MongoDB、Cassandra、Redis、Elasticsearch和Neo4j等。它们在不同的应用场景下具有广泛的应用,如大数据分析、实时数据处理、内容管理、社交网络和推荐系统等。
MySQL数据库
MySQL是一种开源的关系型数据库管理系统(RDBMS),广泛用于各种应用程序和网站开发中。MySQL具有以下特点和功能:
-
可靠性和稳定性:MySQL经过广泛的测试和使用,被认为是一种可靠且稳定的数据库系统。它具有良好的数据持久性,支持事务处理和ACID属性,确保数据的一致性和可靠性。
-
跨平台支持:MySQL可以运行在多个操作系统上,包括Windows、Linux、macOS等,具有良好的跨平台性能。
-
高性能:MySQL被设计为高性能的数据库系统,具有高效的查询处理和数据访问能力。它支持索引、查询优化和缓存等机制,以提高查询速度和响应时间。
-
容易使用:MySQL提供了简单易用的命令行界面和图形化界面工具,使得数据库的管理和操作变得简单和方便。它支持标准的SQL语言,具有良好的兼容性。
-
扩展性:MySQL支持水平和垂直的扩展,可以通过集群、分片和复制等方式来处理大规模数据和高并发访问。
-
安全性:MySQL提供了多种安全机制,包括用户认证、权限管理、数据加密和网络安全等,以保护数据库的安全性和隐私。
-
社区支持:MySQL是一个开源的数据库系统,拥有庞大的开发者社区。这意味着用户可以获得广泛的文档、教程和支持,以解决问题和优化数据库性能。
MySQL被广泛应用于Web应用程序、企业级应用、电子商务、社交媒体等各种场景。它是一种成熟且可靠的数据库解决方案,具有良好的性能、易用性和扩展性。
冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。
主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
使用范围
小型、中型、大型网站
C/S架构的系统
分布式系统软件
集群系统软件
大规模集群软件系统
MySQL演变
简单应用
数据量比较小;数据索引比较少、也比较小;访问强度比较低
垂直拆分
有一定的读写并发量;数据量达到一定规模;数据索引达到一定复杂程度
主从结构
极高的读取压力;一定程度的写入压力
水平拆分
极高的读取写入能力;数据容量极大
云计算
无限的读取写入能力;无限的容量
MySQL安装
Windows下安装
首先下载安装器:MySQL :: Download MySQL Installer
推荐大家下载离线版本,虽然下载的时候慢,但是安装的时候不容易卡死或者失败
点击Download之后,看到下面的页面
选择图中的链接点击,直接下载,可以不用注册或者登录
这里我们下载的是社区版。和商业版虽然有差距,但是差距不大,初学者基本可以忽略。
下载完成后可以看到 .msi文件,双击进行安装
点击执行(Execute)按钮
安装后进入下一步
选择好各个项目之后,就会开始进行安装
服务器配置的时候如下:
点击Next后
我们选择开发模式,如下图
注意,这里要选择下面,否则编程的时候可能会出现不兼容的意外情况
新版的用户远程登录的时候,密码认证过程和老版不一样
所以最好兼容老版
账号密码记得设置,并保存
否则找回是不可能找回的,只能重置
Root密码不要太简单,可以复杂一点,养成好习惯
我这里设置的是FengPan12#$56
然后设置服务,并设置开机启动如上图
指定端口,并打开防火墙,如上图
右键点击“我的电脑”-“属性”-“高级”-“环境变量”-“系统变量”-双击“Path”-将mysql的路径“C:\Program Files\MySQL\MySQL Server 8.0\bin”添加进去-“确定”添加完毕之后,再到DOS下进行测试:
输入mysql -u root -p你的密码
Linux(Ubuntu)下安装
执行:sudo apt-get install mysql-server安装服务器(yum)
执行:sudo apt install mysql-client安装客户端(用于验证服务器是否安装成功)
执行:sudo apt install libmysqlclient-dev安装开发环境(用于后续开发编程用)
打开/etc/mysql/mysql.conf.d/mysqld.cnf
使用vim进行修改保存后
执行命令:
mysqld --initialize
执行service mysql restart命令,重启mysql
登录测试
首次安装后,root密码默认是空的
可以通过下面的命令来设置密码
mysqladmin -u root password “123456”
先测试本地的登录
看到上面的界面,则表示本地登录成功
MySQL开发配置(Windows VS2019下)
MySQL开发头文件和库文件,在安装目录下找到lib和include目录,如下图
记录下include和lib的绝对路径,如果是Linux环境,则一般在/usr/include/mysql
在lib下面有这样几个文件:mysqlclient.lib,libmysql.lib,libmysql.dll
这三个文件分成两组:mysqlclient.lib一组;libmysql.lib和libmysql.dll一组
mysqlclient.lib相当于静态库,而libmysql.lib和libmysql.dll相当于动态库引用
而Linux下:
则是引用/usr/lib/x86_64-linux-gnu/libmysqlclient.a,作为静态库引用
或者引用/usr/lib/x86_64-linux-gnu/libmysqlclient.so,作为动态库引用
创建一个控制台项目并且打开项目属性,并且上面提到的include文件夹复制到项目根目录,以及libmysql.lib和libmysql.dll 都放到根目录
设置头文件路径
使用#pragma comment(lib,"libmysql.lib")来导入库
然后在代码中引入头文件 #include <mysql.h>
还需要把项目的架构修改为64,因为数据库是64位的
编译成功
MySQL数据库连接
连接的过程:
- 创建MYSQL对象
- 初始化MYSQL对象
- 连接数据库
- 增删改查超作
- 关闭数据库操作
初始化函数
MYSQL* pDB = mysql_init(mysql);
数据库连接函数
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);
参数说明:
- 1. mysql:初始化过的MYSQL对象
- 2. host:服务器地址[ip、localhost、域名]
- 3. user:连接服务器所使用的用户
- 4. passwd:用户对于的密码
- 5. db:连接服务器时所使用的库,如果为空,则使用默认数据库mysql
- 6. port:连接服务器所用的端口,默认是3306,具体依据数据库来定
- 7. unix_socket:unix套接字连接方式,一般是指本地管道或者本地套接字,如果没有设为NULL
- 8. clientflag:一般情况下为0,除非你知道你要干什么,否则不要使用下面的内容:
CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS 客户端可以处理过期的密码
CLIENT_COMPRESS 在协议中进行数据压缩
CLIENT_FOUND_ROWS 返回匹配的结果,而非更改的结果
CLIENT_IGNORE_SIGPIPE 抑制管道信号的处理,防止与已有的管道信号处理冲突
CLIENT_IGNORE_SPACE 允许函数名称后面的空格
CLIENT_INTERACTIVE 使用interactive_timeout来设置超时时间,而不是通过wait_timeout函数来得知超时
CLIENT_LOCAL_FILES 允许加载本地数据处理
CLIENT_MULTI_STATEMENTS 告诉服务器客户端可能发送多个statements
CLIENT_NO_SCHEMA 不允许db_name.tbl_name.col_name这样的语法(用于兼容ODBC)
CLIENT_ODBC 没有用了(以前兼容odbc用的)
CLIENT_OPTIONAL_RESULTSET_METADATA 针对高频而短小的查询优化(但是可能导致其他问题)
CLIENT_SSL 使用加密协议。官方不建议使用,最好使用mysql_options() 或者mysql_ssl_set()来替换。
CLIENT_REMEMBER_OPTIONS 这个是为了方便connect失败后,重新连接的时候用的。如果有这个,options设置一次后,如果失败,可以直接使用connect,而不必再次调用options
返回值:
- 成功连接时,返回一个MYSQL结构的指针,该指针用于后续的数据库操作。
- 连接失败时,返回NULL,并可以通过调用mysql_error()函数获取错误信息。
该函数用于建立与MySQL服务器的连接,并返回一个MYSQL结构的指针,该指针用于后续的数据库操作。在连接成功后,可以使用该指针执行各种数据库操作,如查询、插入、更新等。
需要注意的是,mysql_real_connect()函数是MySQL C API中的一个底层函数,通常需要与其他函数结合使用,如mysql_init()函数用于初始化MYSQL结构、mysql_close()函数用于关闭连接等。同时,还需要在连接成功后进行错误处理,并在不需要使用连接时及时释放资源。
#include <iostream>
#include <mysql.h>
#pragma comment(lib,"libmysql.lib")
int main()
{
MYSQL* mysql = new MYSQL();
//MYSQL mysql;//占用的是栈上的内存
MYSQL* pDB = mysql_init(mysql);
if (pDB == NULL) {
std::cout << "mysql_init failed!" << std::endl;
return -1;
}
pDB = mysql_real_connect(pDB, "localhost", "root", "", "mysql", 3306, NULL, 0);
std::cout << pDB << std::endl;
if (pDB) {
std::string sql = "";
int ret = mysql_real_query(pDB, sql.c_str(), sql.size());
if (ret != 0) {
std::cout << "mysql error:" << mysql_error(pDB) << std::endl;
}
mysql_close(pDB);
}
delete mysql;
}