重新学习MySQL数据库11:以Java的视角来聊聊SQL注入

锐捷校园网SQL注入漏洞复现:从手工探测到自动化利用 SQL注入是一种常见的Web安全漏洞,其核心原理在于应用程序未对用户输入进行充分验证和过滤,导致攻击者能够通过构造恶意输入来篡改原始SQL查询逻辑。这种漏洞的技术价值在于,它直接威胁到数据库的机密性、完整性和可用性,是数据泄露和未授权访问的主要入口之一。在网络安全攻防演练和渗透测试中,掌握SQL注入的检测与利用是安全工程师的必备技能。通过手工探测结合自动化工具(如SQLMap),可以高效地验证漏洞存在性并提取敏感数据。本文聚焦于教育行业广泛部署的锐捷校园网自助服务系统,深入剖析其operatorReport 阅读详情

本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看

https://github.com/h2pl/Java-Tutorial

喜欢的话麻烦点下Star哈

文章首发于我的个人博客:

www.how2playlife.com

本文是微信公众号【Java技术江湖】的《重新学习MySQL数据库》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。

该系列博文会告诉你如何从入门到进阶,从sql基本的使用方法,从MySQL执行引擎再到索引、事务等知识,一步步地学习MySQL相关技术的实现原理,更好地了解如何基于这些知识来优化sql,减少SQL执行时间,通过执行计划对SQL性能进行分析,再到MySQL的主从复制、主备部署等内容,以便让你更完整地了解整个MySQL方面的技术体系,形成自己的知识框架。

如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。

<!-- more -->

前言

靶场准备

首先我们来准备一个web接口服务,该服务可以提供管理员的信息查询,这里我们采用springboot + jersey 来构建web服务框架,数据库则采用最常用的mysql。下面,我们来准备测试环境,首先建立一张用户表jwtk_admin,SQL如下:

然后插入默认的管理员:

这样我们就有了两位系统内置管理员了,管理员密码采用MD5进行Hash,当然这是一个很简单的为了作为研究靶场的表,所以没有很全的字段。

接下来,我们创建 spring boot + jersey 构建的RESTFul web服务,这里我们提供了一个通过管理员用户名查询管理员具体信息的接口,如下:

SQL注入测试

首先我们以开发者正向思维向web服务发送管理员查询请求,这里我们用PostMan工具发送一个GET请求

不出我们和开发者所料,Web接口返回了我们想要的结果,用户名为admin的管理员信息。OK,现在开发任务完成,Git Push,Jira任务点为待测试,那么这样的接口就真的没有问题了吗?现在我们发送这样一条GET请求:

发送该请求后,我们发现PostMan没有接收到返回结果,而Web服务后台却开始抛 MySQLSyntaxErrorException异常了,错误如下:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘‘xxxx’’’ at line 1

原因是在我们查询的 xxxx’ 处sql语句语法不正确导致。这里我们先不讨论SQL语法问题,我们继续实验,再次构造一条GET查询请求:

此时,我们可以惊讶的发现,查询接口非但没有报错,反而将我们数据库jwti_admin表中的所有管理员信息都查询出来了:

这是什么鬼,难道管理员表中还有 name=xxxx’or’a’='a 的用户?这就是 SQL Injection。

注入原理分析

在接口中接受了一个String类型的name参数,并且通过字符串拼接的方式构建了查询语句。在正常情况下,用户会传入合法的name进行查询,但是却会传入精心构造的参数,只要参数通过字符串拼接后依然是一句合法的SQL查询,此时SQL注入就发生了。正如我们上文输入的name=xxxx’or’a’='a与我们接口中的查询语句进行拼接后构成如下SQL语句:

当接口执行此句SQL后,系统后台也就相当于拱手送给了,一看到管理员密码这个hash,都不用去cmd5查了,直接就用123456密码去登录你的后台系统了。Why?因为123456的md5哈希太常见了,别笑,这就是很多中小网站的现实,弱口令横行,不见棺材不落泪!

好了,现在我们应该明白了,SQL Injection原因就是由于传入的参数与系统的SQL拼接成了合法的SQL而导致的,而其本质还是将用户输入的数据当做了代码执行。在系统中只要有一个SQL注入点被发现,那么基本上可以执行任意想执行的SQL语句了,例如添加一个管理员,查询所有表,甚至”等等,当然本文不是讲解SQL注入技巧的文章,这里我们只探讨SQL注入发生的原因与防范方法。

JDBC的预处理

在上文的接口中,DAO使用了比较基础的JDBC的方式进行数据库操作,直接使JDBC构建DAO在比较老的系统中还是很常见的,但这并不意味着使用JDBC就一定不安全,如果我将传入的参数 xxxx’or’a’='a 整体作为参数进行name查询,那就不会产生SQL注入。在JDBC中,提供了 PreparedStatement (预处理执行语句)的方式,可以对SQL语句进行查询参数化,使用预处理后的代码如下:

同样,我们使用上文的注入方式注入 ,此时我们发现,SQL注入没能成功。现在,我们来打印一下被被预处理后的SQL,看看有什么变化:

看到了吗?所有的 ’ 都被 ’ 转义掉了,从而可以确保SQL的查询参数就是参数,不会被恶意执行,从而防止了SQL注入。

Mybatis下注入防范

MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架, 其几乎避免了所有的 JDBC 代码和手动设置参数以及获取结果集。同时,MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录,因此mybatis现在在市场中采用率也非常高。这里我们定义如下一个mapper,来实现通过用户名查询管理员的接口:

同样提供Web访问接口:

接下来,我们尝试SQL注入name字段,可以发现注入并没有成功,通过打印mybatis的Log可以看到mybatis框架对参数进行了预处理处理,从而防止了注入:

那是否只要使用了mybatis就一定可以避免SQL注入的危险?我们把mapper做如下修改,将参数#{name}修改为${name},并使用name=‘xxxx’ or ‘a’=‘a’ 作为GET请求的参数,可以发现SQL注入还是发生了:

那这是为什么,mybatis ${}与#{}的差别在哪里?

原来在mybatis中如果以形式声明为SQL传递参数,mybatis将不会进行参数预处理,会直接动态拼接SQL语句,此时就会存在被注入的风险,所以在使用mybatis作为持久框架时应尽量避免采用

形式声明为SQL传递参数,mybatis将不会进行参数预处理,会直接动态拼接SQL语句,此时就会存在被注入的风险,所以在使用mybatis作为持久框架时应尽量避免采用形式声明为SQL传递参数。

mybatis将不会进行参数预处理,会直接动态拼接SQL语句,此时就会存在被注入的风险,所以在使用mybatis作为持久框架时应尽量避免采用{}的形式进行参数传递,如果无法避免(有些SQL如like、in、order by等,程序员可能依旧会选择${}的方式传参),那就需要对传入参数自行进行转义过滤。

JPA注入防范

JPA是Sun公司用来整合ORM技术,实现天下归一的ORM标准而定义的Java Persistence API(java持久层API),JPA只是一套接口,目前引入JPA的项目都会采用Hibernate作为其具体实现,随着无配置Spring Boot框架的流行,JPA越来越具有作为持久化首选的技术,因为其能让程序员写更少的代码,就能完成现有的功能。

例如强大的JpaRepository,常规的SQL查询只需按照命名规则定义接口,便可以不写SQL(JPQL/SQL)就可以实现数据的查询操作,从SQL注入防范的角度来说,这种将安全责任抛给框架远比依靠程序员自身控制来的保险。因此如果项目使用JPA作为数据访问层,基本上可以很大程度的消除SQL注入的风险。

但是话不能说的太死,在我见过的一个Spring Boot项目中,虽然采用了JPA作为持久框架,但是有一位老程序员不熟悉于使用JPQL来构建查询接口,依旧使用字符串拼接的方式来实现业务,而为项目安全埋下了隐患。

安全需要一丝不苟,安全是100 - 1 = 0的业务,即使你防御了99%的,那还不算胜利,只要有一次被了,那就有可能给公司带来很严重的后果。

关于JPA的SQL注入,我们就不详细讨论了,因为框架下的注入漏洞属于框架漏洞范畴(如CVE-2016-6652),程序员只要遵循JPA的开发规范,就无需担心注入问题,框架都为你做好幕后工作了。

SQL注入的其他防范办法

很多公司都会存在老系统中有大量SQL注入风险代码的问题,但是由于其已稳定支持公司业务很久,不宜采用大面积代码更新的方式来消除注入隐患,所以需要考虑其采用他方式来防范SQL注入。除了在在SQL执行方式上防范SQL注入,很多时候还可以通过架构上,或者通过其他过滤方式来达到防止SQL注入的效果。

一切输入都是不安全的:对于接口的调用参数,要进行格式匹配,例如admin的通过name查询的接口,与之匹配的Path应该使用正则匹配(因为用户名中不应该存在特殊字符),从而确保传入参数是程序控制范围之内的参数,即只接受已知的良好输入值,拒绝不良输入。注意:验证参数应将它与输出编码技术结合使用。

利用分层设计来避免危险:前端尽量静态化,尽量少的暴露可以访问到DAO层的接口到公网环境中,如果现有项目,很难修改存在注入的代码,可以考虑在web服务之前增加WAF进行流量过滤,当然代码上就不给hacker留有***的漏洞才最好的方案。也可以在拥有nginx的架构下,采用OpenRestry做流量过滤,将一些特殊字符进行转义处理。

尽量使用预编译SQL语句:由于动态SQL语句是引发SQL注入的根源。应使用预编译语句来组装SQL查询。

规范化:将输入安装规定编码解码后再进行输入参数过滤和输出编码处理;拒绝一切非规范格式的编码。

小结

其实随着ORM技术的发展,Java web开发在大趋势上已经越来越远离SQL注入的问题了,而有着Entity Framework框架支持的ASP.NET MVC从来都是高冷范。在现在互联网中,使用PHP和Python构建的web应用是目前SQL注入的重灾区。本文虽然是从JAVA的角度来研究SQL注入的问题,但原理上同样适用于其他开发语言,希望读者可以通过此文,触类旁通。

珍爱数据,远离拼接,有输入的地方就会有江湖…

Web安全攻防实战:从SQL注入到XSS的漏洞原理与纵深防御体系构建 Web安全的核心在于理解常见漏洞的原理与攻击链。SQL注入通过恶意输入篡改数据库查询逻辑,而XSS(跨站脚本攻击)则利用浏览器执行恶意脚本,两者都源于对用户输入缺乏充分验证。这些漏洞的技术价值在于揭示了信任边界破坏的严重后果,可能导致数据泄露、权限提升甚至服务器沦陷。在实际应用场景中,现代Web应用大量使用JavaScript动态生成DOM元素,这增加了DOM型XSS的风险;同时,文件上传功能若处理不当,可能成为攻击者上传Webshell的直接通道。本文从渗透测试视角,深入拆解SQL注入、XSS、文件上传等 阅读详情

相关推荐

百度秋招笔试复盘:C++/PHP/GO考点与备战策略

后端开发笔试中,语言功底与算法思维缺一不可。从C++的智能指针与设计模式,到PHP的错误处理与PDO预处理,再到Go面试题常考的并发调度与标准库,都要求工程师深入理解底层原理。技术笔试的核心是考察候选人对概念、原理及工程应用的掌握,而不仅仅是刷题数量。针对大厂后端岗位的笔试场景,本文基于百度秋招C++/PHP/GO工程师真实考题,细致复盘了内存管理、弱类型陷阱、channel并发等高频考点与答题策略,并给出了时间分配和备考路线。无论你是应届生还是转行者,都能借此快速定位知识盲区,高效准备同类笔试。

weixin_34416649的博客 422

java中连接Mysql以及PreparedStatement如何防止sql注入

在 java 中如何连接到 MySQL 数据库,执行 SQL 查询,并处理查询结果?

渗透之路,攻防之间皆学问 1226

【Mysql系列】MySQL及SQL注入

【Mysql系列】MySQL及SQL注入

weixin_54707168的博客 463

以mysql为例介绍PreparedStatement防止sql注入原理

最近,在写程序时开始注意到sql注入的问题,由于以前写代码时不是很注意,有一些sql会存在被注入的风险,那么防止sql注入的原理是什么呢?我们首先通过PrepareStatement这个类来学习一下吧! 作为一个IT业内人士只要接触过数据库的人都应该知道sql注入的概念及危害,那么什么叫sql注入呢?我在这边先给它来一个简单的定义:sql注入,简单来说就是用户在前端web页面输入恶意的sql语句用

lisehouniao的博客 1万+

JAVA- SQL注入案例(黑马程序员)和避免 超级详细

SQL 注入(SQL Injection)是一种常见的网络攻击技术,它利用应用程序没有正确过滤用户输入的数据,将恶意的 SQL 代码注入到应用程序中执行,从而导致应用程序的安全性受到威胁。通过一段字符串(伪造的sql代码)与真的代码进行拼接使整个 SQL语句的条件判断永远为真,从而绕过了应用程序的身份验证机制,获取了用户的数据。应用程序需要对用户输入的数据进行正确的验证和过滤!-概括:拼字符串导致分不清参数和执行的关键字!PreparedStatement接口。输入正确的用户名和密码=登录成功。

meini32的博客 4253

基于Java的开源ERP系统实践:从源码分析到二次开发落地

从企业信息化建设中的常见痛点出发,围绕开源ERP的选型与落地,探讨如何借助Java技术栈构建一套完整、可扩展的业务管理系统。文章从基础概念讲起,分析ERP系统的核心模块与业务闭环原理,梳理主从表设计、状态机、事务控制等关键技术,并结合实际部署与二次开发流程,展示如何从零开始读懂源码、改造字段、上线运维。适合Java开发者、中小企业技术团队参考,帮助读者理解从采购、销售到库存财务的一体化业务逻辑,掌握开源ERP在真实业务场景中的应用价值。

weixin_33922670的博客 319

mysql 字符串拼接_重新学习MySQL数据库11:以Java的视角来聊聊SQL注入

本文转自互联网 本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下Star哈 文章首发于我的个人博客: http://www.how2playlife.com 本文是微信公众号【Java技术江湖】的《重新学习MySQL数据库》...

weixin_39620684的博客 136

利用JDBC工具类的方式实现mysql数据库的连接并且完成登录相关功能(防sql注入方式)

利用JDBC工具类的方式实现mysql数据库的连接并且完成登录相关功能,并且通过PreparedStatement类实现防sql注入

redis学习_Java工程师学习指南第7部分:重新学习MySQL与Redis

本文整理了微信公众号【Java技术江湖】发表和转载过的Mysql和Redis相关优质文章,想看到更多Java技术文章,就赶紧关注本公众号吧吧。大白话说说mysql面试官:给我说说你平时是如何优化MySQL的?MySQL知识点总结[修订版]我以为我对Mysql索引很了解,直到我遇到了阿里的面试官以Java的视角来聊聊SQL注入在工作中常用到的SQL告别慢SQL,如何去写一手好SQL ?一份完整的阿里...

weixin_39668890的博客 125

MediaPipe+Unity动作捕捉实战:如何用普通摄像头驱动3D人物模型(附避坑指南)

本文详细介绍了如何利用MediaPipe和Unity实现低成本动作捕捉,仅需普通摄像头即可驱动3D人物模型。通过MediaPipe的3D坐标预测能力,结合Unity的骨骼映射优化,解决单目摄像头下的三维重建难题,并提供实战避坑指南和性能优化技巧,帮助开发者快速实现专业级的人物模型驱动效果。

weixin_29047545的博客 356

华为/H3C/锐捷交换机配置命令对比表:一张图搞定VLAN划分与端口设置

本文详细对比了华为、H3C、锐捷三大品牌交换机在VLAN划分与端口设置中的配置命令差异,提供从基础配置到高级功能的横向对比表,帮助网络工程师快速掌握多品牌设备混用环境下的配置技巧,提升工作效率。

rust6ferris的博客 699

MySQL updatexml报错注入实战:从原理到渗透测试技巧

SQL注入是Web安全领域的核心漏洞类型之一,其本质是攻击者通过构造恶意输入,使应用程序将用户数据误解析为SQL代码执行。在无法直接获取查询结果的场景下,报错注入成为一种高效的信息提取手段,它利用数据库执行错误时返回的详细信息来泄露数据。MySQL中的updatexml函数因其稳定触发错误和易于控制的特性,成为报错注入的常用技术。该函数在处理XML时,若XPath参数格式非法便会报错,攻击者通过将查询结果拼接至XPath参数中,即可使敏感数据随错误信息回显。这种技术在渗透测试中价值显著,尤其适用于错误信息可

weixin_33980459的博客 380

AI训练师团队管理运营思路

工具运营AI训练师主要是支撑运营,协助算法和运营提高托管机器人的解决能力,以协助降低业务场景熔断与优化场景识别为核心运营目标,通过算法聚类、标注分析等方式,结合业务知识,提供精准、清晰的标注数据和解决方案,确保训练效果满足需求。过程中需要与算法、运营一块参与模型搭建和数据验收,并且负责核心指标和数据日常的跟踪维护。④针对知识库已有意图进行梳理和分析,反馈运营评估缺失或合并意图优化方向。③对语料数据进行挖掘、清洗,解除缠绕、冗余等问题导致的未识别。①线上case分析,及时发现识别问题导致的托管熔断问题。

qq_25438419的博客 1084

JavaWeb+MySQL图书管理系统毕业设计:MD5加密与事务控制实战

在Web应用开发领域,用户认证与数据一致性是两大核心课题。哈希加密技术,如MD5,通过单向函数将密码转化为不可逆的密文存储,其核心原理在于利用雪崩效应确保数据完整性,从而在基础层面保障系统安全。数据库事务则通过ACID特性,确保如借书、扣减库存等关联操作的原子性与一致性,这是构建可靠业务逻辑的基石。结合JavaWeb的Servlet/JSP技术栈与MySQL数据库,开发者能够实践经典的三层架构,实现从数据持久化、业务逻辑处理到前端展示的全链路开发。本文以图书管理系统这一经典毕业设计项目为载体,详细拆解了如何

weixin_34183910的博客 280

【PVCodeNet】《Palm Vein Recognition Network Combining Transformer and CNN》

1]吴凯,沈文忠,贾丁丁,等.融合Transformer和CNN的手掌静脉识别网络[J].计算机工程与应用,2023,59(24):98-109.

bryant_meng 1280

Zynq裸机调试RTL8211FS网卡踩坑记:从ping不通到完美兼容的完整代码修改

本文详细记录了在Zynq平台上使用Xilinx SDK(XSDK)调试RTL8211FS网卡的完整过程,从最初的ping不通问题到最终实现完美兼容的解决方案。通过分析PHY芯片的寄存器配置差异,提供了关键代码修改和调试技巧,帮助开发者快速解决类似问题。

weixin_42550597的博客 419

MySQL存储过程实战:从基础语法到游标、事务与异常处理

存储过程是数据库中的预编译SQL语句集合,它将业务逻辑封装在数据库层,通过一次编写、多处调用的方式提升代码复用性。其核心原理是将复杂的SQL操作和流程控制(如条件判断、循环)组织成可调用的单元,减少了应用层与数据库之间的网络交互次数,从而提升执行效率。在技术价值上,存储过程特别适用于处理数据密集型任务,如复杂报表生成、ETL流程和批量数据处理,能够有效降低网络开销并保证数据操作的原子性。应用场景包括高频数据操作、历史数据迁移以及对性能敏感的核心计算任务。本文以MySQL存储过程为例,详细解析了其创建、调用、

weixin_34252090的博客 388

基于Simscape的双PID比例调速阀与比例溢流阀液压控制系统建模与仿真

本文提出了一种基于Simscape的双PID液压控制系统建模方法,通过比例调速阀和比例溢流阀实现液压缸速度与压力的解耦控制。系统采用Simscape Fluids物理建模,精确模拟液压元件非线性特性。文章详细介绍了液压被控对象建模过程,包括动力单元、比例阀组合建模、执行机构及传感器配置。同时设计了双PID控制器架构,分别控制速度环和压力环,并给出参数整定建议。该方法通过物理网络直接模拟流体流动和压力动态,相比传统传递函数法具有更高精度,为液压系统仿真提供了有效解决方案。

AI的内部世界的博客 284

渗透测试入门指南:从核心流程到实战演练,构建安全思维

渗透测试作为网络安全领域的关键实践,本质是在授权下模拟攻击者行为,以评估系统安全性。其核心原理遵循标准化的测试流程,从信息收集、威胁建模到漏洞利用与报告,旨在主动发现潜在风险。这项技术的价值在于将安全防护从被动响应转向主动验证,广泛应用于企业安全评估、合规审计及安全能力建设中。对于初学者而言,掌握如Kali Linux、Nmap等基础工具,并通过DVWA等靶场进行SQL注入等漏洞的实战演练,是建立系统性安全思维、避免成为依赖工具的“脚本小子”的关键起点。

weixin_30642869的博客 369

12S BMS 核心设计:基于 STM32H743+BQ34Z100 的 SOC/SOH 实现与全链路技术解析(上)

本文详细介绍了基于STM32H743和BQ34Z100的12串锂电池管理系统(BMS)设计。该系统采用主控制器+专用电量监测计架构,可实现高精度SOC(±1%)和SOH(±2%)估算,支持36V-50.4V电压范围。硬件设计包括电压/电流采样、温度测量、保护电路等模块,软件实现基于HAL库开发,采用DMA方式提高I2C通信效率。系统通过TI专利的ImpedanceTrack™算法实现三维融合估算,并具备完善的保护功能。该设计适用于电动工具、轻型电动车等中功率设备,具有精度高、响应快。

bother3000的博客 1393

Chamfer Loss

ChamferLoss是一种常用于3D点云(pointcloud)处理的损失函数,特别是在点云生成和对齐任务中。它的目的是度量两个点集之间的相似度,特别是在点云重建、配准或生成等任务中,常用于优化模型使得生成的点云更接近真实的点云。

夜空中明亮的星的专栏 455

Oracle CPU安全更新深度解析:309个漏洞的应急响应与修复实战

在软件开发和运维领域,安全漏洞管理是保障系统稳定与数据安全的核心环节。其原理在于通过持续识别、评估和修复软件缺陷,以应对潜在的网络攻击。这项技术的价值在于构建主动防御体系,将安全左移,从源头降低风险。典型的应用场景包括企业级数据库、中间件和云服务的定期安全加固。近期,甲骨文发布的季度关键补丁更新涉及309个安全漏洞,其中包含大量可远程利用的高危项,这为理解漏洞应急响应提供了绝佳案例。面对此类大规模更新,系统化的影响评估、严格的测试验证以及分批次滚动部署是关键。同时,结合常见的文件上传漏洞和XSS漏洞等Web

weixin_33946605的博客 493

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

中间件漏洞复现实战:从Shiro反序列化到Log4j2 JNDI注入

在网络安全领域,漏洞复现是理解安全威胁本质的关键实践。其核心原理在于通过模拟攻击过程,将抽象的安全概念转化为可验证的实战经验。从技术价值看,这不仅能够验证漏洞的真实性与危害性,更能帮助安全从业者构建自己的知识体系和排查能力。在应用场景上,针对中间件漏洞的复现尤为重要,因为中间件作为连接操作系统与上层应用的桥梁,一旦存在安全缺陷,影响范围极广。本文聚焦于Apache Shiro反序列化漏洞和Log4j2远程代码执行漏洞的复现过程,通过搭建隔离的虚拟化环境,使用ysoserial、JNDI-Injection-

weixin_34290631的博客 1055

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

上一篇: 重新学习MySQL数据库10:MySQL里的那些日志们
下一篇: 重新学习MySQL数据库12:从实践sql语句优化开始
wrr-cat
博客等级 码龄9年 128粉丝 302原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值