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数据库命令执行
执行命令的过程:
- 发送SQL命令
- 获取SQL执行结果
- 解析获取到的结果
发送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;
关键字和含义如下:
- AUTO_INCREMENT 自动增加,只能用于整数类型列
- NOT NULL 列不能为空
- NULL 列可以为空
- PRIMARY KEY 主键 表中主键的值是唯一的,可以用于标记和查找数据
- UNSIGNED 无符号的数,只能修饰整数类型列
- DEFAULT 默认值 用于指定列的默认值
- UNIQUE 唯一 该列的要么为NULL要么就必须是唯一的,不可重复
- 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;
}
相关文章:
MySQL数据库 编程入门
目录 MySQL数据库数据类型 MySQL数据库命令执行 创建用户 创建删除库 创建删除表 MySQL数据库数据类型 MySQL数据库定义了多种数据类型,下面是一些常见的MySQL数据类型及其对应的C/C类型: 整数类型: TINYINT:有符号范围-1…...
6.golang函数
函数是执行特定任务的代码块。函数接受输入,对输入执行一些计算,然后生成输出。 函数声明 在 go 中声明函数的语法是: func name(parameter) (result-list){//body }函数声明以func关键字开头,后跟name(函数名)。在括号中指定参…...
软件可靠性测试常见的方法
“测试”一般是指“为了发现程序中的错误而执行程序的过程”,可靠的测试性是相对重要的,在部分产品开始的测试阶段,需要的就是可靠的测试性,机构,所以存在意义较大。但是在不同的开发阶段、对于不同的人员,…...
C/C++字节对齐
C/C字节对齐 C/C字节对齐1.G_PACKED2.1 pack(push)2.2 pack(1) 全部例子 C/C字节对齐 1.G_PACKED #ifdef __GNUC__#define G_PACKED( __Declaration__ ) __Declaration__ __attribute__((packed)) #else#define G_PACKED( __Declaration__ ) __pragma( pack(push,1)) __Decla…...
【Android知识笔记】性能优化专题(四)
App 线程优化 线程调度原理 任意时刻,只有一个线程占用CPU,处于运行状态多线程并发:轮流获取CPU使用权JVM负责线程调度:按照特定机制分配CPU使用权线程调度模型 分时调度模型:轮流获取、均分CPU时间抢占式调度模型:优先级高的获取,JVM采用Android线程调度 nice值:Proc…...
DC电源模块的散热措施
BOSHIDA DC电源模块的散热措施 DC电源模块的散热措施可以分为以下几种: 1. 增加散热器:在DC电源模块的电路板上增加散热片或散热器,通过增加散热面积和散热能力来提高散热效果。 2. 增加风扇:在散热器的基础上增加风扇ÿ…...
uniapp H5、小程序、APP端自定义不同运行环境(开发、测试、生产)、自定义条件编译平台、以及动态修改manifest.json值讲解
文章目录 前言一、自定义条件编译平台是什么?二、新增自定义条件编译平台三、动态设置服务器请求地址四、动态修改manifest.json1.根目录新增文件 modifyManifest.js2.vue.config.js引入modifyManifest.js 总结示例代码 前言 企业项目开发流程上一般都要配置多个运…...
centos 显卡驱动安装(chatglm2大模型安装步骤一)
1.服务器配置 服务器系统:Centos7.9 x64 显卡:RTX3090 (24G) 2.安装环境 2.1 检查显卡驱动是否安装 输入命令:nvidia-smi(显示显卡信息) 如果有以下显示说明,已经有显卡驱动。否则需要重装。 2.2 下载显卡驱动 第一步:浏览器输入https://www.nvidia.cn/Downloa…...
05_属性描述符
05_属性描述符 文章目录 05_属性描述符一、属性描述符是什么?二、属性描述符①:查看属性描述②:设置属性描述符③:案例01.代码实现02.代码实现(优化) 一、属性描述符是什么? 属性描述符的结构 在…...
vue day2
1、指令修饰符:.指明一些指令后缀,不同后缀封装不同处理操作 按键修饰符:keyup.enter v-model修饰符: v-model.trim:去首位空格 v-model.number:转数字 事件修饰符: 阻止事件冒泡࿱…...
四川劳动保障杂志社四川劳动保障编辑部四川劳动保障杂志2023年第10期目录
主题报道 四川抢抓“金九银十”招聘季多措并举稳就业促就业 举措频“上新” 金秋送岗忙 张玉芳; 2-5 法眼《四川劳动保障》投稿:cnqikantg126.com 筑牢长期护理保险基金安全防线 李科仲;赖晓薇; 6-7 调研 提升职业技能培训工作的举措 寇爵; 8-9 城乡…...
python数据类型
int 整型 i 1str 字符串 name1Emliy name2"你好" content""" Emily:你好! """ test你最"帅" test2"你最帅"float 浮点类型 height182.5 weight45.3bool 布尔类型 f1True f2Falselist …...
大数据-之LibrA数据库系统告警处理(ALM-37004 Datanode主备不同步或者断连)
告警解释 当DN主实例与DN备实例连接异常时,产生该告警。 告警属性 告警ID 告警级别 可自动清除 37004 严重 是 告警参数 参数名称 参数含义 ServiceName 产生告警的服务名称 RoleName 产生告警的角色名称 HostName 产生告警的主机名 Instance 产生…...
带你用uniapp从零开发一个仿小米商场_2.创建空白项目及公共样式引入
创建空白项目 打开uniapp 点击新建->项目 如下, 是编辑你项目的名字的地方是你项目存放地址,可以点击浏览器去文件管理里面选地址是模板选择,这里选择默认模板就好是一些其他选择比如uvue能让你项目在编译成软件时运行更快,unicloud能让你用js写后端,且直接就是云开发,g…...
1144. 连接格点,Kruskal算法,二维矩阵压缩为一维
有一个 m 行 n 列的点阵,相邻两点可以相连。 一条纵向的连线花费一个单位,一条横向的连线花费两个单位。 某些点之间已经有连线了,试问至少还需要花费多少个单位才能使所有的点全部连通。 输入格式 第一行输入两个正整数 m 和 n。 以下若…...
C++ : 友元(未完结)
不能从外部访问类的私有数据成员和方法,但这条规则不适用于友元类和友元函数。要声明友元 类或友元函数,可使用关键字 friend,通过让函数成为类的友元,可以赋予该函数与类的成员函数 同的访问权限。 生活中你的家有客厅 (Public)…...
Nginx 服务器 SSL 证书安装部署
操作场景 本文档以证书名称 menglinfeng.top 为例。 Nginx 版本以 nginx/1.18.0 为例。 当前服务器的操作系统为 CentOS 7,由于操作系统的版本不同,详细操作步骤略有区别。 安装 SSL 证书前,请您在 Nginx 服务器上开启 “443” 端口…...
GC9118S低压 5V 全桥驱动芯片,内置过温保护,低电流睡眠模式,可替代TMI8118
GC9118S 是一款低压 5V 全桥驱动芯 片,为摄像机、消费类产品、玩具和其他低 压或者电池供电的运动控制类应用提供了集 成的电机驱动解决方案。 GC9118S 能提供高达 1.1A 的持续输出 电流。可以工作在 2~6V 的电源电压上。 GC9118S 具有 PWM ( IN/…...
windows dockerdesktop 安装sqlserver2022
1.下载windows dockertop软件 下载连接 2.安装完成配置,下载源地址 {"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},"experimental": false,"registry-mirrors": …...
在ubuntu系统安装SVN服务端,并通过客户端进行远程访问
文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…...
利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...
