数据库项目初体验:使用C语言连接数据库完成短地址服务(本地运行版)

前言:初学者的思考

作为一个刚初学数据库的小白并且在之前我的博客中我有尝试使用C语言写过一个短地址服务,但是使用C语言编写的短地址服务只有短记忆性,正好刚刚学习到这部分,所以决定巩固一下学习的知识做一个简易的连接数据库的C语言短地址服务
这个项目算是比较认真学习的一个项目希望你觉得对你有用的话可以多给我点个赞点个收藏!


一、项目简介

本项目通过C语言调用MySQL数据库,实现一个本地运行的“短地址服务”小系统。你可以输入一个长网址,系统会生成一个短码,之后通过短码可以查回原始网址,并统计访问次数。
本项目适合初学者体验C语言与数据库的结合,所有代码和SQL均为本地运行版,简单易懂。


二、环境准备

1. 安装MySQL数据库

  • Windows推荐用MySQL Installer安装,Linux用包管理器安装。
  • 安装好后记住你的MySQL用户名(如root)和密码。

2. 安装MySQL开发库

  • Windows:安装MySQL时勾选“MySQL C API开发文件”。
  • Linux
    sudo apt-get install libmysqlclient-dev
    

3. 安装C语言编译器

  • Windows:推荐MSYS2/MinGW-w64,安装后有gcc。
  • Linux
    sudo apt-get install build-essential
    

4.为即将连接的数据库创建一个用户和密码

创建用户 tom
sudo mysql
create user tom@'%' identified by '123456';

创建用户tom
密码是123456
连接库操作在完成数据库建立后进行


三、数据库表结构(SQL)

新建一个文件 short_url_db.sql,内容如下:

-- 包含短地址映射表和访问统计表,CREATE DATABASE IF NOT EXISTS short_url_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE short_url_db;-- 1. 短地址映射表
CREATE TABLE IF NOT EXISTS short_urls (id INT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',short_code VARCHAR(10) UNIQUE NOT NULL COMMENT '短代码',long_url TEXT NOT NULL COMMENT '原始长地址',created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',INDEX idx_short_code (short_code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='短地址映射表';

以下是对于代码的一些解释

CREATE DATABASE IF NOT EXISTS short_url_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  • 创建一个名为 short_url_db 的数据库。
  • IF NOT EXISTS 表示如果数据库已存在则不会报错。
  • CHARACTER SET utf8mb4 设置字符集为utf8mb4,支持更多字符(如表情符号)。
  • COLLATE utf8mb4_unicode_ci 设置排序规则为不区分大小写的Unicode排序。
USE short_url_db;
  • 选择刚刚创建的 short_url_db 数据库,后续的表都建在这个库里。
CREATE TABLE IF NOT EXISTS short_urls (id INT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',short_code VARCHAR(10) UNIQUE NOT NULL COMMENT '短代码',long_url TEXT NOT NULL COMMENT '原始长地址',created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',INDEX idx_short_code (short_code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='短地址映射表';

创建短地址映射表 short_urls,用于存储短网址与原始长网址的映射关系。
字段说明:
id:主键,自增,唯一标识每条记录。
short_code:短网址代码,长度最多10个字符,唯一且不能为空。
long_url:原始长网址,类型为TEXT,不能为空。
created_at:记录创建时间,默认为当前时间。
idx_short_code:为 short_code 字段创建索引,加快查询速度。
表使用 InnoDB 引擎,字符集为 utf8mb4,表注释为“短地址映射表”


执行方法:

  1. 打开MySQL命令行或图形工具,登录后执行以上SQL,或用命令行导入:
    mysql -u root -p < short_url_db.sql
    

将用户tom连接到数据库

grant all on short_url_db.* to tom@'%';

授权 tom 访问数据库 short_url_db 中所有的数据对象

验证用户能否连接
mysql -u tom -p


四、C语言主程序

新建 short_url_my.c,内容如下:

// short.c
// 编译: gcc short.c -o short -lmysqlclient
// 简单短地址服务演示程序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mysql/mysql.h>// 生成随机短码
void generate_code(char *code, int len) {const char *charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";for (int i = 0; i < len; ++i) {code[i] = charset[rand() % 62];}code[len] = '\0';
}int main() {MYSQL *conn;conn = mysql_init(NULL);if (!conn) {fprintf(stderr, "初始化错误:%s\n", mysql_error(conn));return 1;}// 修改为你的MySQL信息char *host = "127.0.0.1";char *user = "root";char *passwd = "你的密码"; // <-- 这里填写你的MySQL密码char *db = "short_url_db";int port = 3306;if (!mysql_real_connect(conn, host, user, passwd, db, port, NULL, 0)) {fprintf(stderr, "连接失败:%s\n", mysql_error(conn));mysql_close(conn);return 1;}printf("连接成功\n");int choice;char long_url[2048], short_code[7], query[4096];while (1) {printf("\n1. 生成短地址\n2. 查询长地址\n3. 统计访问量\n4. 退出\n请选择:");scanf("%d", &choice);getchar(); // 吸收回车if (choice == 1) {printf("输入长地址:");fgets(long_url, sizeof(long_url), stdin);long_url[strcspn(long_url, "\n")] = 0;// 防止短码重复:循环生成直到唯一int is_unique = 0;while (!is_unique) {generate_code(short_code, 6);sprintf(query, "SELECT id FROM short_urls WHERE short_code='%s'", short_code);if (mysql_query(conn, query)) {fprintf(stderr, "查询短码时出错:%s\n", mysql_error(conn));return 1;}MYSQL_RES *res = mysql_store_result(conn);if (res) {if (mysql_num_rows(res) == 0) {is_unique = 1; // 没有重复,可以用}mysql_free_result(res);}}sprintf(query, "INSERT INTO short_urls(long_url, short_code) VALUES('%s', '%s')", long_url, short_code);if (mysql_query(conn, query)) {fprintf(stderr, "插入失败:%s\n", mysql_error(conn));} else {printf("短地址生成成功,短码为:%s\n", short_code);}} else if (choice == 2) {printf("输入短码:");scanf("%s", short_code);sprintf(query, "SELECT id, long_url FROM short_urls WHERE short_code='%s'", short_code);if (mysql_query(conn, query)) {fprintf(stderr, "查询失败:%s\n", mysql_error(conn));} else {MYSQL_RES *res = mysql_store_result(conn);MYSQL_ROW row = mysql_fetch_row(res);if (row) {printf("长地址为:%s\n", row[1]);// 记录访问sprintf(query, "INSERT INTO url_stats(short_url_id, ip_address, user_agent) VALUES(%s, '127.0.0.1', 'C-Client')", row[0]);mysql_query(conn, query);} else {printf("未找到该短码\n");}mysql_free_result(res);}} else if (choice == 3) {printf("输入短码:");scanf("%s", short_code);sprintf(query, "SELECT COUNT(*) FROM url_stats s JOIN short_urls u ON s.short_url_id=u.id WHERE u.short_code='%s'", short_code);if (mysql_query(conn, query)) {fprintf(stderr, "统计失败:%s\n", mysql_error(conn));} else {MYSQL_RES *res = mysql_store_result(conn);MYSQL_ROW row = mysql_fetch_row(res);printf("访问次数:%s\n", row ? row[0] : "0");mysql_free_result(res);}} else if (choice == 4) {break;} else {printf("无效选择\n");}}mysql_close(conn);return 0;
}

五、编译与运行

1. 编译

  • Linux
    gcc short.c -o short -lmysqlclient
    
  • Windows(假设已配置好MySQL开发库和MinGW-w64):
    gcc short.c -o short.exe -I"C:\\Program Files\\MySQL\\MySQL Server 8.0\\include" -L"C:\\Program Files\\MySQL\\MySQL Server 8.0\\lib" -lmysqlclient
    

2. 运行

  • Linux
    ./short
    
  • Windows
    .\\short.exe
    
    运行成功!
    在这里插入图片描述
    以我的csdn博客主页为例
    在这里插入图片描述在这里插入图片描述

    项目完成!

六、如何查询使用完程序之后的数据库产生的数据

我相信很多同学做完了项目可能就忽略了这点,这就是纯C语言制作短地址项目与连接数据库最大的不同,他会将历史数据都存储在里面方便查看

使用MySQL命令行查询

  1. 登录MySQL

    mysql -u tom -p
    

    输入你的MySQL密码。

  2. 切换到你的数据库

    USE short_url_db;
    
  3. 查询所有短地址映射

    SELECT * FROM short_urls;
    

    你会看到所有生成过的短码、原始长地址、创建时间等信息。
    在这里插入图片描述
    (这是我在刚刚生成的一条短地址)

  4. 查询访问统计记录

    SELECT * FROM url_stats;
    

    你会看到每次访问的短码ID、访问时间、IP、User-Agent等信息。
    在这里插入图片描述

  5. 根据短码查找原始网址

    SELECT long_url FROM short_urls WHERE short_code='你的短码';
    

    在这里插入图片描述

  6. 统计某个短码的访问次数

    SELECT COUNT(*) FROM url_stats s JOIN short_urls u ON s.short_url_id=u.id WHERE u.short_code='你的短码';
    

在这里插入图片描述


  • 所有历史数据都在MySQL数据库的 short_urlsurl_stats 两张表里。
  • 只要数据库没删,数据都在,随时可查!

七、常见问题与排查

  • 找不到mysql.h:开发库没装好或-I路径没写对。
  • 找不到-lmysqlclient:库文件没装好或-L路径没写对。
  • 连接失败:用户名、密码、数据库名不对,或MySQL服务没启动。
  • 插入失败:Unknown column ‘user_id’ in ‘field list’:表结构和代码不一致,按本博客的SQL和代码即可避免。
    短码重复:本文章中我已经进行了代码修改即采用伪代码逻辑,现在程序会在插入短码前自动检查数据库,确保不会生成重复的短码。如果生成的短码已存在,会自动重新生成,直到唯一为止。
    网页逻辑检验:有输入以 http://、https:// 开头,或包含 .com、.cn、.net、.org 等常见域名后缀时,才会继续生成短码,否则会提示“输入的不是有效的网址,请重新输入!”并让用户重新输入。

八、项目结构参考

short_url_service/
├── db_setup_no_user.sql      # 数据库建表脚本
├── short_url_my.c            # C语言主程序

九、总结

本项目用最基础的C语言和MySQL数据库,带你体验了“短地址服务”的完整开发流程。
你学会了:

  • 如何用SQL建表
  • 如何用C语言连接和操作数据库
  • 如何编译和运行本地C程序
  • 如何查询使用C程序之后在数据库中存入的数据

建议:

  • 进一步学习可以尝试加上用户系统、密码哈希、Web接口等功能。

祝你玩转C语言+数据库,迈出项目开发第一步!

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

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

相关文章

mysql基础(一)快速上手篇

连接mysql 使用命令行窗口连接mysql数据库 语法&#xff1a;mysql –h主机名 –u用户名 –p密码 说明&#xff1a;-h参数指定数据库ip&#xff0c;本地服务器可以用localhost&#xff0c;-u参数指定用户名&#xff0c;-p参数指定用户密码。 注意&#xff1a;-p和密码值之间…

IntelliJ IDEA 2025- 下载安装教程图文版详细教程(附激活码)

目录 写在前面 一、介绍 二、下载 三、安装 &#x1f3c1; 写在最后 写在前面 > &#x1f680; 初学 Java&#xff1f;或者刚开始写项目&#xff0c;不知道该选哪个 IDE&#xff1f; 本篇教程手把手教你安装 IntelliJ IDEA —— JetBrains 出品的顶级 Java 开发环境&a…

数学经济专业大学四年规划

数学经济专业结合了数学的逻辑严谨性和经济学的现实应用性&#xff0c;为学生提供了强大的数理分析能力和经济洞察力。该专业毕业生在金融科技、量化投资、商业分析等领域具有显著优势&#xff0c;尤其在数字经济时代&#xff0c;这类复合型人才的需求量持续增长。一、数学经济…

局域网打印机共享怎么设置?如何配置内网本地网络打印机给异地电脑远程连接使用打印?

打印机共享怎么设置&#xff1f;如何设置本地内网的网络打印机共享给其他网络下电脑连接打印&#xff1f;打印机设置使用以及异地使用打印都是大家比较关注的问题&#xff0c;下面详细教程中分二步&#xff0c;先讲局域网内的打印机共享&#xff0c;再进一步介绍内网打印机地址…

Rust异步爬虫实现与优化

Rust 语言在爬虫领域的应用相对较少&#xff0c;尽管 Rust 的 async/await 已稳定&#xff0c;但其与线程安全、Pin 等概念的结合仍较复杂&#xff0c;而爬虫高度依赖并发处理&#xff0c;进一步提高了开发成本。这就导致了使用Rust语言爬虫用的人很少。 下面是一个使用 Rust 编…

Electron 安全最佳实践:构建安全的桌面应用

Electron 是一个流行的框架&#xff0c;允许开发者使用 Web 技术&#xff08;HTML、CSS、JavaScript&#xff09;构建跨平台桌面应用。许多知名应用&#xff0c;如 VS Code、Slack 和 Discord&#xff0c;都基于 Electron 开发。然而&#xff0c;由于其结合了 Node.js&#xff…

MySQL 事务详解:从基础操作到隔离级别与 MVCC 原理

前言 首先从概念上进行理解什么是事务&#xff0c;以及事务的4大属性&#xff0c;知道是什么还要知道为什么&#xff1f; 事务是如何进行操作的&#xff0c;最后在谈事务的隔离性、隔离级别&#xff08;最重要但是也很难理解&#xff09;&#xff0c;理解隔离级别体现在哪里 …

【Unity 编辑器工具开发:GUILayout 与 EditorGUILayout 对比分析】

Unity 编辑器工具开发&#xff1a;GUILayout 与 EditorGUILayout 对比分析 一、核心区别对比 方面GUILayoutEditorGUILayout区别命名空间UnityEngineUnityEditorEditorGUILayout 仅限编辑器环境适用范围游戏运行时 编辑器工具仅限编辑器工具运行时禁用 EditorGUILayout渲染管…

[附源码+数据库+毕业论文]基于Spring+MyBatis+MySQL+Maven+jsp实现的个人财务管理系统,推荐!

摘 要 随着软件信息技术的兴起&#xff0c;许多手工作业也升级为软件管理数据&#xff0c;本次针对个人财务数据的管理&#xff0c;开发一款个人财务管理系统&#xff0c;该系统可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及…

Compose入门3 - 高仿小红书 界面

使用compose 实现一个小红书UI 界面&#xff0c;主要是为了锻炼 使用compose布局的能力 demo地址&#xff1a;https://github.com/PangHaHa12138/ComposeDemo 先上demo 截图 下面是完整的compose代码 package com.example.test001import android.annotation.SuppressLint imp…

mybatis-plus json字段使用typeHandler自动转换为List

mybatis-plus json字段使用typeHandler自动转换为List mybatis-plus json字段使用typeHandler自动转换为List 一、实现思路 1.配置mybatis配置&#xff0c;注入handlermybatis-plus:typeHandlersPackage: com.power.common.core.handler 2.字段顶部增加注解TableField(typeHand…

(C++)学生管理系统(测试2版)(map数组的应用)(string应用)(引用)(C++教学)(C++项目)

1. 头文件与命名空间 #include <iostream> // 输入输出流库&#xff0c;提供cin/cout等基本I/O功能 #include <map> // 映射容器库&#xff0c;提供map数据结构&#xff08;键值对集合&#xff09; #include <string> // 字符串库&#xff0c;…

使用assembly解决jar包超大,实现依赖包、前端资源外置部署

成果物需要部署到用户内网的童鞋应该都遇到过该问题&#xff1a;引入的maven依赖越来越多&#xff0c;jar包越来越大&#xff0c;我之间甚至见过一两个G的依赖&#xff0c;想改个代码换到现场测试&#xff0c;包传到现场要一二十分钟&#xff0c;真正实现了改代码两分钟分钟&am…

基于PHP+MySQL实现(Web)英语学习与测试平台

数据库课设&#xff1a;英语学习与测试平台 运行环境要求 PHP7.1 基于 thinkPHP6.0、Layui、Xadmin 开发 主要功能 公共模块 登录注册个人信息修改密码修改 教师模块 文章查看发布班级管理测试查看发布批改历史成绩查看 学生模块 文章查看参与测试查看成绩 管理员模块…

WinForm中Settings.settings和app.config修改后信息不同步到exe.config问题

在 WinForms 项目中&#xff0c;Settings.settings 和 app.config/exe.config 的关系确实容易让人困惑。以下是问题的根本原因和解决方案&#xff1a; 问题本质 设计时文件&#xff1a;app.config&#xff08;源码中的配置文件&#xff09;运行时文件&#xff1a;bin/Debug/Yo…

【公司环境下发布个人NPM包完整教程】

&#x1f3e2; 公司环境下发布个人NPM包完整教程 创建时间: 2025年7月2日 适用场景: 公司电脑&#xff0c;需要临时切换个人账户发布npm包 &#x1f3af; 教程概述 场景说明 环境: 公司电脑&#xff0c;已配置公司npm账户目标: 临时使用个人账户发布npm包&#xff0c;发布后恢复…

渗透测试中 phpinfo() 的信息利用分析

在渗透测试中&#xff0c;phpinfo() 是一个非常常见却极具价值的信息泄露点。这个函数的本意是向开发者展示当前 PHP 环境的详细配置情况&#xff0c;包括编译选项、扩展模块、环境变量、系统信息、目录路径等。然而一旦该页面被暴露到互联网上&#xff0c;攻击者便可以借此收集…

《如何在 Spring 中实现 MQ 消息的自动重连:监听与发送双通道策略》

大家好&#xff0c;我是G探险者&#xff01;&#x1f4cc; 背景场景在高可用分布式系统中&#xff0c;我们经常面临&#xff1a;MQ 集群重启 → 消息监听中断MQ 网络短暂抖动 → 发送端连接失败一端恢复正常&#xff0c;另一端仍处于挂死状态如果你只配置了“连接工厂层”的重连…

OpenCV 安装使用教程

一、OpenCV 简介 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源计算机视觉和机器学习软件库&#xff0c;提供了超过 2500 个优化的算法&#xff0c;用于实时图像处理、视频分析、对象识别、人脸检测、机器学习等任务。 Python 提供了对 Open…

【SNN脉冲神经网络3】HH神经元软件仿真

本篇文章主要核心目的在于研究明白HH神经元的数学模型&#xff0c;并且验证其正确性。因此&#xff0c;在本篇文章中只会使用numpy函数库用于构建神经元&#xff0c;以及matplotlib用于绘图。1.导入对应的库import numpy as np import matplotlib.pyplot as plt import re impo…