一.数据类型
MySQL中有多种数据类型,每种类型用于存储不同类型的数据。以下是MySQL中常见的数据类型:
-
数值类型:
- INT:整数类型,存储范围为-2,147,483,648到2,147,483,647。
- BIGINT:大整数类型,存储范围为-9,223,372,036,854,775,808到9,223,372,036,854,775,807。
- FLOAT:单精度浮点数类型。
- DOUBLE:双精度浮点数类型。
- DECIMAL:定点数类型,用于精确存储小数。
-
字符串类型:
- CHAR:固定长度字符串,最大长度为255个字符。
- VARCHAR:可变长度字符串,最大长度为65535个字符。
- TEXT:长文本类型,最大长度为65,535个字符。
-
日期和时间类型:
- DATE:日期类型,格式为'YYYY-MM-DD'。
- TIME:时间类型,格式为'HH:MM:SS'。
- DATETIME:日期和时间类型,格式为'YYYY-MM-DD HH:MM:SS'。
- TIMESTAMP:时间戳类型,用于存储日期和时间的组合。(时间戳从1970.1.1的秒数)
-
布尔类型:
- BOOL 或 BOOLEAN:布尔类型,存储true或false。
-
二进制类型:
- BLOB:二进制大对象类型,用于存储二进制数据。
- LONGBLOB:长二进制大对象类型,用于存储更大的二进制数据。
此外,MySQL还支持其他特殊数据类型,如枚举类型(ENUM)和集合类型(SET),用于存储从预定义选项中选择的值。
二.MYSQL基础知识
多个数据库服务器可以集群工作
一个服务器上有多个数据库,一个数据库上有多个数据表
数据库:数据表的集合
1.创建MYSQL对象并初始化
MYSQL* mysql = new MYSQL();MYSQL* pDB = mysql_init(mysql); //初始化mysql对象//这里两个变量 mysql和pDB 两个变量记录(指向)同一个值避免初始化失败后返回NULL指针内存泄漏的风险if (pDB == NULL) {std::cout << "mysql_init failed!" << std::endl;return -1;}
2.连接数据库
pDB = mysql_real_connect(pDB, "localhost", "root", "1234", "mysql", 3306, NULL, 0);
补充:
3.创建新的用户
int creat_user(MYSQL* pDB){ //创建新用户std::string sql = "CREATE USER 'fc'@'localhost' IDENTIFIED BY ''";int ret = mysql_real_query(pDB, sql.c_str(), (unsigned long)sql.size());if (ret != 0) {std::cout << "mysql error:" << mysql_error(pDB) << std::endl;return -1;}return 0;
}
4.给用户授权权限和 撤销权限
int grant_userpower(MYSQL* pDB) { //授予用户权限std::string sql = "GRANT ALL PRIVILEGES ON *.* TO 'fc'@'localhost' with grant option";int ret = mysql_real_query(pDB, sql.c_str(), (unsigned long)sql.size());if (ret != 0) {std::cout << "mysql error:" << mysql_error(pDB) << std::endl;return -1;}return 0;
}
5.删除用户
drop USER fc@localhost
6.MYSQL仓库的创建和删除
int creat_database(MYSQL* pDB) { //创建数据仓库std::string sql = "CREATE DATABASE hello";int ret = mysql_real_query(pDB, sql.c_str(), (unsigned long)sql.size());if (ret != 0) {std::cout << "mysql error:" << mysql_error(pDB) << std::endl;return -1;}return 0;
}int grant_database_power(MYSQL* pDB) { //授予仓库权限std::string sql = "GRANT ALL ON hello.* TO 'fc'@'localhost'";int ret = mysql_real_query(pDB, sql.c_str(), (unsigned long)sql.size());if (ret != 0) {std::cout << "mysql error:" << mysql_error(pDB) << std::endl;return -1;}return 0;
}
三.MYSQL命令的执行
发送SQL命令
获取SQL执行结果
解析获取到的结果
MYSQL_RES* result = mysql_use_result(mysql);
if (result != NULL) {show_result(result); //展示数据mysql_free_result(result); //释放结果,与use_result相互对应
}
void show_result(MYSQL_RES* result) {//获取结果集列的数量unsigned nFiles = mysql_num_fields(result);//获取结果集行的数量my_ulonglong nRows = mysql_num_rows(result);//获取每一列的定义接口:MYSQL_FIELD* fields = mysql_fetch_fields(result);for (unsigned i = 0; i < nRows; i++) { //遍历每一行MYSQL_ROW row = mysql_fetch_row(result);//获取每一行结果if (row != NULL) {for (unsigned j = 0; j < nFiles; j++) {//对于每一行遍历每列的信息std::cout << "type:" << fields[j].type << " " << fields[j].name << " : " << row[j] << std::endl; //对应存储数据的值}}std::cout << "==================" << std::endl;}}
附录:
完整代码
#include <iostream>
#include <mysql.h>void show_result(MYSQL_RES* result) {//获取结果集列的数量unsigned nFiles = mysql_num_fields(result);//获取结果集行的数量my_ulonglong nRows = mysql_num_rows(result);//获取每一列的定义接口:MYSQL_FIELD* fields = mysql_fetch_fields(result);for (unsigned i = 0; i < nRows; i++) { //遍历每一行MYSQL_ROW row = mysql_fetch_row(result);//获取每一行结果if (row != NULL) {for (unsigned j = 0; j < nFiles; j++) {//对于每一行遍历每列的信息std::cout << "type:" << fields[j].type << " " << fields[j].name << " : " << row[j] << std::endl; //对应存储数据的值}}std::cout << "==================" << std::endl;}}int creat_user(MYSQL* pDB){ //创建新用户std::string sql = "CREATE USER 'fc'@'localhost' IDENTIFIED BY ''";int ret = mysql_real_query(pDB, sql.c_str(), (unsigned long)sql.size());if (ret != 0) {std::cout << "mysql error:" << mysql_error(pDB) << std::endl;return -1;}return 0;
}int grant_userpower(MYSQL* pDB) { //授予用户权限std::string sql = "GRANT ALL PRIVILEGES ON *.* TO 'fc'@'localhost' with grant option";int ret = mysql_real_query(pDB, sql.c_str(), (unsigned long)sql.size());if (ret != 0) {std::cout << "mysql error:" << mysql_error(pDB) << std::endl;return -1;}return 0;
}int creat_database(MYSQL* pDB) { //创建数据仓库std::string sql = "CREATE DATABASE hello";int ret = mysql_real_query(pDB, sql.c_str(), (unsigned long)sql.size());if (ret != 0) {std::cout << "mysql error:" << mysql_error(pDB) << std::endl;return -1;}return 0;
}int grant_database_power(MYSQL* pDB) { //授予仓库权限std::string sql = "GRANT ALL ON hello.* TO 'fc'@'localhost'";int ret = mysql_real_query(pDB, sql.c_str(), (unsigned long)sql.size());if (ret != 0) {std::cout << "mysql error:" << mysql_error(pDB) << std::endl;return -1;}return 0;
}int fe() {MYSQL* mysql = new MYSQL();MYSQL* pDB = mysql_init(mysql); //初始化mysql对象//这里两个变量 mysql和pDB 两个变量记录(指向)同一个值避免初始化失败后返回NULL指针内存泄漏的风险if (pDB == NULL) {std::cout << "mysql_init failed!" << std::endl;return -1;}pDB = mysql_real_connect(pDB, "localhost", "root", "1234", "mysql", 3306, NULL, 0);//连接数据库std::cout << pDB << std::endl;if (pDB) {//creat_user(pDB);//grant_userpower(pDB);//creat_database(pDB);//grant_database_power(pDB);//获取SQL的数据MYSQL_RES* result = mysql_use_result(mysql);if (result != NULL) {show_result(result); //展示数据mysql_free_result(result); //释放结果,与use_result相互对应}}mysql_close(pDB);delete(mysql);return 0;}int main()
{fe();return 0;}