MySQL数据库 编程入门

目录

MySQL数据库数据类型

MySQL数据库命令执行

创建用户

创建删除库

创建删除表


MySQL数据库数据类型

MySQL数据库定义了多种数据类型,下面是一些常见的MySQL数据类型及其对应的C/C++类型:

整数类型:

  • TINYINT:有符号范围-128到127,无符号范围0到255。对应的C/C++类型为signed char或unsigned char。
  • SMALLINT:有符号范围-32768到32767,无符号范围0到65535。对应的C/C++类型为short或unsigned short。
  • INT:有符号范围-2147483648到2147483647,无符号范围0到4294967295。对应的C/C++类型为int或unsigned int。
  • BIGINT:有符号范围-9223372036854775808到9223372036854775807,无符号范围0到18446744073709551615。对应的C/C++类型为long long或unsigned long long。

浮点数类型:

  • FLOAT:单精度浮点数。对应的C/C++类型为float。
  • DOUBLE:双精度浮点数。对应的C/C++类型为double。

字符串类型:

  • CHAR:固定长度字符串,最多255个字符。对应的C/C++类型为char数组。
  • VARCHAR:可变长度字符串,最多65535个字符。对应的C/C++类型为char数组或std::string。
  • TEXT:可变长度文本,最多65535个字符。对应的C/C++类型为char数组或std::string。

日期和时间类型:

  • DATE:日期,格式为YYYY-MM-DD。对应的C/C++类型为struct tm或std::string。
  • TIME:时间,格式为HH:MM:SS。对应的C/C++类型为struct tm或std::string。
  • DATETIME:日期和时间,格式为YYYY-MM-DD HH:MM:SS。对应的C/C++类型为struct tm或std::string。

其他类型:

  • BOOLEAN:布尔类型,值为TRUE或FALSE。对应的C/C++类型为bool。
  • BLOB:二进制大对象,最多65535字节。对应的C/C++类型为unsigned char数组。

MySQL数据库命令执行

执行命令的过程:

  1. 发送SQL命令
  2. 获取SQL执行结果
  3. 解析获取到的结果

发送SQL命令接口

int STDCALL mysql_real_query(MYSQL *mysql, const char *q, unsigned long length);

q是SQL指令;length是指令的长度;向MySQL服务器发送SQL指令

获取SQL执行结果接口

MYSQL_RES *STDCALL mysql_use_result(MYSQL *mysql);

释放结果接口

void STDCALL mysql_free_result(MYSQL_RES *result);

获取结果集列的数量

unsigned int STDCALL mysql_num_fields(MYSQL_RES *res);

获取结果集行的数量

my_ulonglong STDCALL mysql_num_rows(MYSQL_RES *res);

取结果中的行接口

MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result);

获取每一行的长度接口

​​​​​​​unsigned long *STDCALL mysql_fetch_lengths(MYSQL_RES *result);

获取结果集中每一列的定义接口

MYSQL_FIELD *STDCALL mysql_fetch_fields(MYSQL_RES *res);

创建用户

CREATE USER '用户名'@'范围' IDENTIFIED BY '密码';

范围包括:ip、localhost、%

ip即只能从指定地址登录;localhost 即只能从本机登录;% 即可以从任何地址登录

光创建用户,并没有什么作用,还需要授权操作表

GRANT privileges ON databasename.tablename TO '用户名'@'范围'

privileges可以是:

SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER,EXECUTE,INDEX,REFERENCES

ALTER ROUTINE,CREATE ROUTINE,CREATE TEMPORARY,SHOW VIEW,LOCK TABLES

ALL

databasename是库的名称,可以填入*表示所有

tablename是表的名称,可以填入*表示所有

有授权自然有撤销权限

REVOKE 权限 ON databasename.tablename FROM '用户名'@'范围'
#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", "123456", "mysql", 3306, NULL, 0);std::cout << pDB << std::endl;if (pDB) {std::string sql = "CREATE USER 'hello'@'localhost' IDENTIFIED BY '123456'";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;}MYSQL_RES* result = mysql_use_result(mysql);if (result != NULL) {unsigned nFields = 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 < nFields; j++) {std::cout << "type:" << fields[j].type << " " << fields[j].name << ":" << row[j] << std::endl;}}std::cout << "===================================================" << std::endl;}mysql_free_result(result);}sql = "GRANT ALL ON *.* TO 'hello'@'localhost'";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;}result = mysql_use_result(mysql);if (result != NULL) {unsigned nFields = 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 < nFields; j++) {std::cout << "type:" << fields[j].type << " " << fields[j].name << ":" << row[j] << std::endl;}}std::cout << "===================================================" << std::endl;}mysql_free_result(result);}mysql_close(pDB);}delete mysql;
}

创建删除库

MySQL如何创建数据仓库
CREATE DATABASE 数据仓库名;
数据库名称不要使用奇怪的或者特殊的符号,例如空格、路径符、引号

MySQL如何指派仓库权限给用户
GRANT 权限 ON databasename.tablename TO '用户名'@'范围'

删除库
DROP DATABASE 数据仓库名;

切换数据库
USE 数据仓库名;

用户、数据库、表等等,这些元素的创建,一般是不会有返回结果
仅仅有一个返回值,标明执行的结果是成功还是失败!

测试代码

#include <iostream>
#include <mysql.h>#pragma comment(lib,"libmysql.lib")void show_result(MYSQL_RES* result)
{unsigned nFields = 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 < nFields; j++) {std::cout << "type:" << fields[j].type << " " << fields[j].name << ":" << row[j] << std::endl;}}}
}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", "123456", "mysql", 3306, NULL, 0);std::cout << pDB << std::endl;if (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;}MYSQL_RES* result = mysql_use_result(mysql);if (result != NULL) {show_result(result);std::cout << "===================================================" << std::endl;mysql_free_result(result);}//授予权限sql = "GRANT ALL ON hello.* TO 'hello'@'localhost';";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;}result = mysql_use_result(mysql);if (result != NULL) {show_result(result);std::cout << "===================================================" << std::endl;mysql_free_result(result);}sql = "USE hello;";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;}result = mysql_use_result(mysql);if (result != NULL) {show_result(result);std::cout << "===================================================" << std::endl;mysql_free_result(result);}sql = "DROP DATABASE hello;";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;}result = mysql_use_result(mysql);if (result != NULL) {show_result(result);std::cout << "===================================================" << std::endl;mysql_free_result(result);}mysql_close(pDB);}delete mysql;return 0;
}

创建删除表

CREATE TABLE IF NOT EXISTS `表名称` (
`列名称1` 数据类型 关键字列表 默认值
...
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

关键字和含义如下:

  1. AUTO_INCREMENT 自动增加,只能用于整数类型列
  2. NOT NULL 列不能为空
  3. NULL 列可以为空
  4. PRIMARY KEY 主键 表中主键的值是唯一的,可以用于标记和查找数据
  5. UNSIGNED 无符号的数,只能修饰整数类型列
  6. DEFAULT 默认值  用于指定列的默认值
  7. UNIQUE 唯一 该列的要么为NULL要么就必须是唯一的,不可重复
  8. ZEROFILL  0值填充,如果没有指定该列的值,则会填入0

以下为删除MySQL数据表的通用语法:

DROP TABLE `表名称` ;

主键的数据类型,它不能是可变长度的类型,例如:TEXT、BLOB

表名需要使用``符号来包围,千万不能使用单引号

测试代码

#include <iostream>
#include <mysql.h>#pragma comment(lib,"libmysql.lib")void show_result(MYSQL_RES* result)
{unsigned nFields = 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 < nFields; j++) {std::cout << "type:" << fields[j].type << " " << fields[j].name << ":" << row[j] << std::endl;}}}
}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", "123456", "mysql", 3306, NULL, 0);std::cout << pDB << std::endl;if (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;}MYSQL_RES* result = mysql_use_result(mysql);if (result != NULL) {show_result(result);std::cout << "===================================================" << std::endl;mysql_free_result(result);}//授予权限sql = "GRANT ALL ON hello.* TO 'hello'@'localhost';";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;}result = mysql_use_result(mysql);if (result != NULL) {show_result(result);std::cout << "===================================================" << std::endl;mysql_free_result(result);}sql = "USE hello;";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;}result = mysql_use_result(mysql);if (result != NULL) {show_result(result);std::cout << "===================================================" << std::endl;mysql_free_result(result);}sql = "CREATE TABLE IF NOT EXISTS `hello` (`编号` NVARCHAR(16) PRIMARY KEY)ENGINE=InnoDB DEFAULT CHARSET=utf8;";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;}sql = "DROP TABLE `hello`;";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;}sql = "DROP DATABASE hello;";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;}mysql_close(pDB);}delete mysql;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/178538.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AWVS 使用方法归纳

1.首先确认扫描的网站&#xff0c;以本地的dvwa为例 2.在awvs中添加目标 输入的地址可以是域名也可以是ip&#xff0c;只要本机可以在浏览器访问的域名或ip即可 添加地址及描述之后&#xff0c;点击保存&#xff0c;就会展现出目标设置选项 business criticality译为业务关键…

1.Spring源码解析-ClassPathXmlApplicationContext

此类是读取spring的xml配置文件并解析。也是源码入口之一。 我们调试即将开始。 传递给父类设置值 经调试我们得到是给AbstractApplicationContext设置默认的应用上下文父级的值&#xff0c;很明显是空 给父类AbstractRefreshableConfigApplicationContext设置属性 刷新容器…

CentOS7.5安装zookeeper3.9.1详细步骤

备注&#xff1a;Zookeeper依赖Java环境变量&#xff0c;请确保当前环境中有JDK环境 export JAVA_HOME/opt/module/jdk1.8.0_221 export PATH$JAVA_HOME/bin:$PATH export CLASSPATH.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar下载安装包&#xff1a; 进入Zookeeper官…

C++STL库常用详解与原理

CSTL库 学习方法&#xff1a;使用STL的三个境界&#xff1a;能用&#xff0c;明理&#xff0c;能扩展。 常用库 库名称所需头文件数据结构string#include<string>串vector#include<vector>动态数组list#include<list>带头双向循环链表queue#include<queu…

极客大挑战2023 Web方向题解wp 全

最后排名 9/2049。 玩脱了&#xff0c;以为28结束&#xff0c;囤的一些flag没交上去。我真该死啊QAQ EzHttp 前言&#xff1a;这次极客平台太安全了谷歌不给抓包&#xff0c;抓包用burp自带浏览器。 密码查看源码->robots.txt->o2takuXX’s_username_and_password.txt获…

VAE模型及pytorch实现

VAE模型及pytorch实现 VAE模型推导部分最小化KL散度推导代码部分损失函数Encoder部分Decoder部分VAE整体架构 VAE问题参考资料 VAE&#xff08;变分自编码器&#xff09;是一种生成模型&#xff0c;结合了自编码器和概率图模型的思想。它通过学习数据的潜在分布&#xff0c;可以…

Make sure that using this pseudorandom number generator is safe here.

问题类型&#xff1a;安全热点 安全问题级别&#xff1a;MEDIUM 一、问题代码 工具类Package&#xff1a; Java commons-lang3 库 RandomUtils 随机数工具类 import org.apache.commons.lang3.RandomUtils; 用法&#xff1a; RandomUtils.nextInt(0, 999999999) //生成 0…

31.0/LinkedList/Set/ashSet/ TreeSet/Map/ HashMap/ TreeMap

目录 31.1Linkedlist 31.2Set集合 31.3HashSet集合 31.4添加元素 31.5删除 31.6hashSet的遍历 31.7hashSet的源码 31.8TreeSet集合。 31.1Linkedlist 1.凡是查询源码 &#xff0c;我们都是从类的构造方法入手:/*** Constructs an empty list.*/public LinkedList() {}该…

【Java从入门到大牛】网络编程

&#x1f525; 本文由 程序喵正在路上 原创&#xff0c;CSDN首发&#xff01; &#x1f496; 系列专栏&#xff1a;Java从入门到大牛 &#x1f320; 首发时间&#xff1a;2023年11月23日 &#x1f98b; 欢迎关注&#x1f5b1;点赞&#x1f44d;收藏&#x1f31f;留言&#x1f4…

大数据 DataX-Web 详细安装教程

目录 一、DataX-Web 介绍 1.1 DataX-Web 是什么 1.2 DataX-Web 架构 二、DataX-Web 安装部署 2.1 环境要求 2.2 安装 2.3 部署 2.4 数据库初始化 2.5 配置 2.6 启动服务 2.6.1 一键启动所有服务 2.6.2 一键取消所有服务 2.7 查看服务&#xff08;注意&#xff01…

线性分类器--图像表示

整个模型 图像表示 二进制图像 灰度图像 彩色图像 大多数分类算法都要求输入向量&#xff01; rbg的图像矩阵转列向量 大小为 32X32 的话&#xff0c;图像矩阵转列向量是多少维&#xff1f; 32x32x3 3072 维列向量

监控大屏 | 拐角OLED柔性屏:实现拐角处连惯拼接显示

监控大屏 | 拐角OLED柔性屏 产品&#xff1a;20块55寸OLED柔性屏 项目时间&#xff1a;2023年10月 项目地点&#xff1a;贵州 应用场景&#xff1a;在监控大厅三面墙都要装显示屏&#xff0c;利用OLED柔性屏可弯曲的特性&#xff0c;在两个捌角处进行拼接安装。 在2023年10…

如何一分钟内画好可视化图形?

一、定类数据 饼图 描述&#xff1a;用形状类似“饼”的形态描述数据的占比&#xff0c;并且参与绘制的数值没有负值&#xff0c;比如想要直观的查看“月生活费各个板块的占比”。 操作&#xff1a;以SPSSAU为例&#xff0c;使用“频数分析”即可。 示例&#xff1a; 圆环图…

展开运算符 ...

展开运算符 ... 什么是展开运算符...展开数组作为函数参数复制数组合并数组展开对象&#xff08;在某些 JavaScript 版本中&#xff09;注意事项 什么是展开运算符… 展开运算符&#xff08;Spread Operator&#xff09;是 JavaScript 中用于展开可迭代对象&#xff08;如数组…

游戏被攻击了怎么办?游戏正在被流量攻击该怎么解决?

防护产品每年都在迭代更新&#xff0c;黑客的攻击手段看似没啥变化,但是数据量每年都在增加,使得更多用户接触到这方面来,互联网安全也越来越得到大家的重视&#xff0c;因为许多黑客会通过各种ddos攻击手段来获取非法盈利。如果你的服务器正在被ddos攻击&#xff0c;你知道服务…

钉钉直播不了检查防火墙配置没有拦截应用测试直通都放行的,电脑还可以ping通直播域名,就是开始不了直播

环境: 防火墙 AF8.0.17 Win10 专业版 问题描述: 钉钉直播不了检查防火墙配置没有拦截应用测试直通都放行的,电脑还可以ping通直播域名,就是开始不了直播 钉钉直播不了 不能直播电脑电脑可以ping通直播域名 防火墙查了3个域名都没有拦截,AF测试应用直通都放行的 解…

vue3(二)-基础入门之列表循环、数组变动检测、filter模糊查询、事件修饰符

一、列表循环 of 和 in 都是一样的效果 html代码&#xff1a; <div id"app"><ul><li v-for"item of datalist">{{ item }}</li></ul><ul><li v-for"item in dataobj">{{ item }}</li></u…

PyQt6 QPlainTextEdit纯文本控件

​锋哥原创的PyQt6视频教程&#xff1a; 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计28条视频&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面开发 视频教程(无废话…

2023年c语言程序设计大赛

7-1 这是一道送分题 为了让更多的同学参与程序设计中来&#xff0c;这里给同学们一个送分题&#xff0c;让各位感受一下程序设计的魅力&#xff0c;并祝贺各位同学在本次比赛中取得好成绩。 注&#xff1a;各位同学只需将输入样例里的代码复制到右侧编译器&#xff0c;然后直…

Kotlin语言的一些技术点

1. Kotlin 与 Java 的主要区别是什么&#xff1f; 答案&#xff1a;Kotlin 是一种静态类型编程语言&#xff0c;与 Java 完全兼容&#xff0c;但引入了许多改进&#xff1a; 空安全&#xff1a;Kotlin 通过在编译时强制检查空值&#xff0c;减少空指针异常。扩展函数&#xf…