首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

MySQL数据库入门

  • 25-04-24 19:41
  • 4228
  • 12452
blog.csdn.net

目录

前言

一、安装软件

二、普通指令使用

三、MySQL接口API相关函数

1、API函数使用步骤

2、mysql_init-MYSQL对象初始化

3、mysql_real_connect()——数据库引擎建立连接

4、mysql_close()——关闭数据库连接

 5、mysql_query()——查询数据库某表内容

6、mysql_store_result()——向客户端检索完整的结果集

7、mysql_num_fields()——获取字段数量(列数)

8、mysql_free_result()——释放结果集使用的内存

9、mysql_fetch_row()——从结果集中获取下一行

四、使用C语言连接MySQL

五、使用示例

5.1、连接初始化

5.2、构造指令


前言

本博文是学习基于Linux+STM32+esp8266的超级智能无人超市项目里面所需要的一小些数据库使用,本博文便于学习这个项目的数据库部分,可以根据后面的最后一个使用实例来练习数据库的连接,表的删除和更正、查询!

一、安装软件

在电脑不同系统上安装使用MYSQL可以看这个视频:一小时MYSQL

二、普通指令使用

1、终端进入MYSQL:

mysql -u root -p

然后输入密码即可进入

 2、创建数据库

我们可以先查询一下已经有的数据库:

show databases;

创建数据库:

CREATE DATABASE test;

test:数据库名字 

指定使用哪个数据库:

use test;

创建表:

CREATE TABLE users(id VARCHAR(20) unique key,name VARCHAR(50),phone VARCHAR(15) unique key,balance VARCHAR(25),text VARCHAR(1000));

users:表名

 查询表:

desc users;     users:表名

退出MySQL:

exit; 

插入操作:

"INSERT INTO me(pid, pname,price,brand) VALUES('123','lll','100','ddd')";

me:表名

查询操作:

"SELECT * FROM me"; 

me:表名

 删除操作:

DELETE FROM me where name=0;

me:表名

删除me表中name为0的成员

删除全部成员:TRUNCATE TABLE usr;

usr:表名

更改操作:

UPDATE me set name = 0 where price = 100;

me:表名

将price为100的成员的name更改为0

三、MySQL接口API相关函数

1、API函数使用步骤

1,首先需要 mysql的头文件,并链接MQSQL动态库。

#include 

2、创建MYSQL变量

MYSQL mysql;

3、mysql_init初始化MYSQL变量

4、调用mysql_real_connect函数连接Mysql数据库

5、调用mysql_real_query函数进行数据库查询

6、通过调用mysql_store_result或mysql_use_result函数返回的MYSQL_RES变量获取查询结果数据。

7、调用mysql_fetch_row函数读取结果集数据。

8、结果集用完后,调用mysql_free_result函数释放结果集,以防内存泄露
9、不再查询Mysql数据库时,调用mysql_close函数关闭数据库连接

2、mysql_init-MYSQL对象初始化

  1. MYSQL *mysql_init(MYSQL *mysql)

返回值:

  • 初始化的MYSQL*句柄。如果无足够内存以分配新的对象,返回NULL。 错误,在内存不足的情况下,返回NULL。

说明:

  • 如果mysql是NULL指针,该函数将分配、初始化、并返回新对象。

  • 否则,将初始化对象,并返回对象的地址。

  • 如果mysql_init()分配了新的对象,应当在程序中调用mysql_close() 来关闭连接,以释放对象

3、mysql_real_connect()——数据库引擎建立连接

MYSQL *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 client_flag) 

返回值

  • 如果连接成功,返回MYSQL*连接句柄。
  • 如果连接失败,返回NULL。对于成功的连接,返回值与第1个参数的值相同。

参数说明:

  • mysql:前面定义的MYSQL变量;
  • host:MYSQL服务器的地址;
    • 如果“host”是NULL或字符串"localhost",连接将被视为与本地主机的连接。
    • 如果操作系统支持套接字(Unix)或命名管道(Windows),将使用它们而不是TCP/IP连接到服务器。
  • user:登录用户名;
    • 如果“user”是NULL或空字符串"",用户将被视为当前用户。在UNIX环境下,它是当前的登录名。
  • passwd:登录密码;
  • db:要连接的数据库,如果db为NULL,连接会将默认的数据库设为该值。
  • port:MYSQL服务器的TCP服务端口;
    • 如果“port”不是0,其值将用作TCP/IP连接的端口号。注意,“host”参数决定了连接的类型。
  • unix_socket:unix连接方式。
    • 如果unix_socket不是NULL,该字符串描述了应使用的套接字或命名管道。注意,“host”参数决定了连接的类型。
  • clientflag:Mysql运行为ODBC数据库的标记,一般取0。

4、mysql_close()——关闭数据库连接

  1. void mysql_close(MYSQL *mysql)

 5、mysql_query()——查询数据库某表内容

查询数据库中的某一个表内容,通过函数mysql_query()来实现

  1. int mysql_query(MYSQL *mysql, const char *query)
  2. //query为执行的SQL语句对应的字符长串

返回值

  • 如果查询成功,返回0。如果出现错误,返回非0值。

使用说明:

  • 执行由“Null终结的字符串”查询指向的SQL查询。
  • 正常情况下,字符串必须包含1条SQL语句,而且不应为语句添加终结分号(‘;’)或“\g”。如果允许多语句执行,字符串可包含多条由分号隔开的语句。(“多查询执行的C API处理”)
  • mysql_query()不能用于包含二进制数据的查询,应使用mysql_real_query()取而代之(二进制数据可能包含字符‘\0’,mysql_query()会将该字符解释为查询字符串结束)。
  • 如果希望了解查询是否应返回结果集,可使用mysql_field_count()进行检查。
  • 查询成功则该函数返回0。

使用实例:

  1. // 执行操作 SQL 语句(INSERT/UPDATE/DELETE)
  2. bool SQLifconfig_Dml_sql(SQLifconfig *config, const char *sqlstr) {
  3. printf("sql: %s\n", sqlstr);
  4. // 开始事务
  5. if (mysql_query(config->mysql, "BEGIN")) {
  6. printf("query_error: %s\n", mysql_error(config->mysql));
  7. return false;
  8. }
  9. // 执行 SQL 语句
  10. if (mysql_query(config->mysql, sqlstr)) {
  11. printf("query_error: %s\n", mysql_error(config->mysql));
  12. return false;
  13. }
  14. // 提交事务
  15. if (mysql_query(config->mysql, "COMMIT")) {
  16. printf("query_error: %s\n", mysql_error(config->mysql));
  17. return false;
  18. }
  19. return true;
  20. }

6、mysql_store_result()——向客户端检索完整的结果集

显示查询数据库中数据表的内容,mysql_store_result()将mysql_query()查询的全部结果读取到客户端,分配1个MYSQL_RES结构(上面有介绍),并将结果置于该结构中

  1. MYSQL_RES *mysql_store_result(MYSQL *mysql)

返回值

具有多个结果的MYSQL_RES结果集合。如果出现错误,返回NULL。

使用说明:

  • 对于成功检索了数据的每个查询(SELECT、SHOW、DESCRIBE、EXPLAIN、CHECK TABLE等),必须调用mysql_store_result()或mysql_use_result() 。
  • 如果希望了解查询是否应返回结果集,可使用mysql_field_count()进行检查。
  • 如果查询未返回结果集,mysql_store_result()将返回Null指针(例如,如果查询是INSERT语句)。
  • 如果读取结果集失败,mysql_store_result()还会返回Null指针。通过检查mysql_error()是否返回非空字符串,mysql_errno()是否返回非0值,或mysql_field_count()是否返回0,可以检查是否出现了错误。
  • 如果未返回行,将返回空的结果集。(空结果集设置不同于作为返回值的空指针)。
  • 一旦调用了mysql_store_result()并获得了不是Null指针的结果,可调用mysql_num_rows()来找出结果集中的行数。
  • 可以调用mysql_fetch_row()来获取结果集中的行,或调用mysql_row_seek()和mysql_row_tell()来获取或设置结果集中的当前行位置。
  • 一旦完成了对结果集的操作,必须调用mysql_free_result()。

7、mysql_num_fields()——获取字段数量(列数)

  1. int mysql_num_fields(MYSQL_RES *result)

8、mysql_free_result()——释放结果集使用的内存

释放由mysql_store_result()、mysql_use_result()、mysql_list_dbs()等为结果集分配的内存。完成对结果集的操作后,必须调用mysql_free_result()释放结果集使用的内存。

  1. void mysql_free_result(MYSQL_RES *result)

9、mysql_fetch_row()——从结果集中获取下一行

  1. MYSQL_ROW mysql_fetch_row(MYSQL_RES* result)
  2. //MYSQL_ROW开篇已经说明,char ** 类型

返回值

  • 下一行的MYSQL_ROW结构。如果没有更多要检索的行或出现了错误,返回NULL。

使用说明:

  • 在mysql_store_result()之后使用时,如果没有要检索的行,mysql_fetch_row()返回NULL。
  • 在mysql_use_result()之后使用时,如果没有要检索的行或出现了错误,mysql_fetch_row()返回NULL。
  • 行内值的数目由mysql_num_fields(result)给出。如果行中保存了调用mysql_fetch_row()返回的值,将按照row[0]到row[mysql_num_fields(result)-1],访问这些值的指针。
  • 可以通过调用mysql_fetch_lengths()来获得行中字段值的长度。对于空字段以及包含NULL的字段,长度为0。通过检查字段值的指针,能够区分它们。如果指针为NULL,字段为NULL,否则字段为空。

四、使用C语言连接MySQL

下面我们使用C语言来写函数来连接和使用MySQL

sql_connect.c:

  1. #include "sql_connect.h"
  2. #include
  3. #include
  4. #include
  5. // 初始化数据库连接对象
  6. SQLifconfig* SQLifconfig_init() {
  7. SQLifconfig *config = (SQLifconfig*)malloc(sizeof(SQLifconfig));
  8. if (!config) return NULL;
  9. // 初始化成员变量
  10. config->mysql = NULL;
  11. config->row = NULL;
  12. config->result = NULL;
  13. config->field = NULL;
  14. // 初始化 MySQL 连接
  15. config->mysql = mysql_init(NULL);//参数为NULL,函数将分配初始化,并初始化、返回新对象
  16. if (!config->mysql) {
  17. printf("Init Error: %s\n", mysql_error(config->mysql));
  18. free(config);
  19. return NULL;
  20. }
  21. // 强制设置字符集
  22. if (mysql_options(config->mysql, MYSQL_SET_CHARSET_NAME, "utf8mb4")) {
  23. printf("Set UTF-8 Error: %s\n", mysql_error(config->mysql));
  24. mysql_close(config->mysql);
  25. free(config);
  26. return NULL;
  27. }
  28. return config;
  29. }
  30. // 释放数据库连接对象
  31. void SQLifconfig_destroy(SQLifconfig *config) {
  32. if (config) {
  33. if (config->mysql) {
  34. mysql_close(config->mysql);//关闭数据库连接
  35. }
  36. free(config);//释放空间
  37. }
  38. }
  39. // 初始化数据库连接
  40. bool SQLifconfig_SQL_init(SQLifconfig *config, const char *host, const char *user, const char *pwd, const char *dbname) {
  41. if (!mysql_real_connect(config->mysql, host, user, pwd, dbname, 3306, NULL, 0)) {
  42. printf("connect error: %s\n", mysql_error(config->mysql));
  43. return false;
  44. }
  45. return true;
  46. }
  47. // 执行操作 SQL 语句(INSERT/UPDATE/DELETE)
  48. bool SQLifconfig_Dml_sql(SQLifconfig *config, const char *sqlstr) {
  49. printf("sql: %s\n", sqlstr);
  50. // 开始事务
  51. if (mysql_query(config->mysql, "BEGIN")) {
  52. printf("query_error: %s\n", mysql_error(config->mysql));
  53. return false;
  54. }
  55. // 执行 SQL 语句
  56. if (mysql_query(config->mysql, sqlstr)) {
  57. printf("query_error: %s\n", mysql_error(config->mysql));
  58. return false;
  59. }
  60. // 提交事务
  61. if (mysql_query(config->mysql, "COMMIT")) {
  62. printf("query_error: %s\n", mysql_error(config->mysql));
  63. return false;
  64. }
  65. return true;
  66. }
  67. // 执行查询 SQL 语句(SELECT)
  68. char* SQLifconfig_Dql_sql(SQLifconfig *config, const char *sqlstr) {
  69. // 执行 SQL 查询
  70. if (mysql_query(config->mysql, sqlstr)) {
  71. printf("query_error: %s\n", mysql_error(config->mysql));
  72. return NULL;
  73. }
  74. // 获取查询结果集
  75. config->result = mysql_store_result(config->mysql);
  76. if (!config->result) {
  77. return NULL; // 无结果或错误
  78. }
  79. // 获取字段数量(列数)
  80. int fieldnum = mysql_num_fields(config->result);
  81. // 初始化动态缓冲区
  82. size_t total_len = 1024; // 初始缓冲区大小
  83. char *buffer = (char*)malloc(total_len);
  84. if (!buffer) {
  85. mysql_free_result(config->result);
  86. return NULL; // 内存分配失败
  87. }
  88. buffer[0] = '\0'; // 初始化空字符串
  89. // 遍历结果集的每一行
  90. while ((config->row = mysql_fetch_row(config->result))) {
  91. // 计算当前行所需的总长度
  92. size_t row_len = 0;
  93. for (int j = 0; j < fieldnum; j++) {
  94. row_len += strlen(config->row[j] ? config->row[j] : "NULL") + 1; // 字段值 + 分隔符
  95. }
  96. // 动态扩展缓冲区(如果当前缓冲区不足以容纳新行)
  97. size_t current_len = strlen(buffer);
  98. if (current_len + row_len + 2 > total_len) {
  99. total_len += row_len + 2; // 扩展缓冲区大小
  100. char *new_buf = realloc(buffer, total_len);
  101. if (!new_buf) {
  102. free(buffer);
  103. mysql_free_result(config->result);
  104. return NULL; // 内存分配失败
  105. }
  106. buffer = new_buf;
  107. }
  108. // 拼接当前行的字段值
  109. for (int j = 0; j < fieldnum; j++) {
  110. const char *val = config->row[j] ? config->row[j] : "NULL"; // 处理 NULL 值
  111. strcat(buffer, val); // 追加字段值
  112. strcat(buffer, "#"); // 追加分隔符
  113. }
  114. buffer[strlen(buffer)-1] = '\n'; // 将最后一个#替换为换行符
  115. }
  116. // 释放结果集内存
  117. mysql_free_result(config->result);
  118. // 检查是否有有效数据
  119. if (strlen(buffer) == 0) {
  120. free(buffer);
  121. return NULL; // 无数据
  122. }
  123. // 返回格式化后的字符串
  124. return buffer;
  125. }

sql_connect.h:

  1. #ifndef __SQL_CONNECT_H
  2. #define __SQL_CONNECT_H
  3. #include
  4. #include
  5. // 数据库连接结构体
  6. typedef struct {
  7. MYSQL *mysql; // MySQL 连接对象
  8. MYSQL_ROW row; // 当前行数据
  9. MYSQL_RES *result; // 查询结果集
  10. MYSQL_FIELD *field; // 字段信息
  11. } SQLifconfig;
  12. // 初始化数据库连接
  13. SQLifconfig* SQLifconfig_init();
  14. // 释放数据库连接
  15. void SQLifconfig_destroy(SQLifconfig *config);
  16. // 初始化数据库连接
  17. bool SQLifconfig_SQL_init(SQLifconfig *config, const char *host, const char *user, const char *pwd, const char *dbname);
  18. // 执行查询 SQL 语句(SELECT)
  19. char* SQLifconfig_Dql_sql(SQLifconfig *config, const char *sqlstr);
  20. // 执行操作 SQL 语句(INSERT/UPDATE/DELETE)
  21. bool SQLifconfig_Dml_sql(SQLifconfig *config, const char *sqlstr);
  22. #endif

五、使用示例

5.1、连接初始化

建立两个表,并且数据库名为shopping,后面的实验都会围绕这两个表进行实验:

  1. CREATE DATABASE shopping;
  2. CREATE TABLE users(
  3. id VARCHAR(20) unique key,
  4. name VARCHAR(50),
  5. phone VARCHAR(15) unique key,
  6. balance VARCHAR(25),
  7. text VARCHAR(1000)
  8. )
  9. CREATE TABLE me(
  10. pid VARCHAR(20) unique key,
  11. pname VARCHAR(50),
  12. price VARCHAR(15),
  13. brand VARCHAR(25)
  14. )
  1. SQLifconfig *MySQL_Handler;
  2. int main()
  3. {
  4. // 初始化数据库连接对象
  5. MySQL_Handler = SQLifconfig_init();
  6. if (!MySQL_Handler) {
  7. printf("初始化数据库失败\n");
  8. return -1;
  9. }
  10. // 连接数据库 //数据库名字
  11. if (!SQLifconfig_SQL_init(MySQL_Handler, "127.0.0.1", "root", "123456", "shopping")) {
  12. printf("连接数据库失败\n");
  13. SQLifconfig_destroy(MySQL_Handler);
  14. return -1;
  15. }
  16. }

5.2、构造指令

下面就是一些项目中所使用到的指令,可能有一些没有写,不过应该是都写了,类似相同的就不写了!

  1. /* 删除me表中的pid为str的成员 */
  2. // 构造 SQL 删除语句
  3. sprintf(buf, "DELETE FROM me WHERE pid='%s'", str);
  4. // 执行 SQL 删除操作
  5. int result = SQLifconfig_Dml_sql(MySQL_Handler, buf);
  6. /* 查询users表中phone为str的成员的id, name, phone, balance */
  7. sprintf(buf, "SELECT id, name, phone, balance FROM users WHERE phone='%s'", str);
  8. // 执行查询
  9. char* ret = SQLifconfig_Dql_sql(MySQL_Handler, buf);
  10. /* 更新users表中的ide为pid的成员的balance ,修改为balance+num */
  11. sprintf(buf, "UPDATE users SET balance = balance + %d WHERE id='%s'", num, pid);
  12. if (SQLifconfig_Dml_sql(MySQL_Handler, buf))
  13. /* 删除users表中的所有成员 */
  14. SQLifconfig_Dml_sql(MySQL_Handler, "TRUNCATE TABLE users"))
  15. /* 可以用来练习 */
  16. //执行插入操作 //表名
  17. const char *insert_sql = "INSERT INTO users(id, name,phone,balance) VALUES('888','hxy','666',100)";
  18. if (SQLifconfig_Dml_sql(MySQL_Handler, insert_sql)) {// 执行操作 SQL 语句(INSERT/UPDATE/DELETE)
  19. printf("插入成功\n");
  20. } else {
  21. printf("插入失败\n");
  22. }
  23. insert_sql = "INSERT INTO me(pid, pname,price,brand) VALUES('888','hxy','666',100)";
  24. if (SQLifconfig_Dml_sql(MySQL_Handler, insert_sql)) {// 执行操作 SQL 语句(INSERT/UPDATE/DELETE)
  25. printf("插入成功\n");
  26. } else {
  27. printf("插入失败\n");
  28. }
  29. // 执行查询操作 //表名
  30. const char *select_sql = "SELECT * FROM users";
  31. char *result = SQLifconfig_Dql_sql(MySQL_Handler, select_sql);// 执行查询 SQL 语句(SELECT)
  32. if (result) {
  33. printf("查询结果:\n%s", result);
  34. free(result); // 必须手动释放内存
  35. } else {
  36. printf("查询失败或无结果\n");
  37. }
  38. select_sql = "SELECT * FROM me";
  39. result = SQLifconfig_Dql_sql(MySQL_Handler, select_sql);// 执行查询 SQL 语句(SELECT)
  40. if (result) {
  41. printf("查询结果:\n%s", result);
  42. free(result); // 必须手动释放内存
  43. } else {
  44. printf("查询失败或无结果\n");
  45. }

注:本文转载自blog.csdn.net的一只波本的文章"https://blog.csdn.net/2302_80169672/article/details/146402262"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top