关于sql语句的闭合方式
前言
以前一直以为字符型的SQL语句只能用单引号或双引号闭合,数值型可以不用闭合。以为php的SQL语句能用括号闭合是因为PHP的特性。自己的基础实在不行。
准备:
建一张包含数值型和字符型字段的表,并插入数据。
这里有一个在线测试sql语句的网站(http://sqlfiddle.com),含有以下数据库运行环境,很方便。
左边输入框执行建库、表、添加数据等操作,右边执行查询语句,如show、select。
常用闭合方式:
单引号''
、双引号""
、括号()
、括号+单引号('')
、多层括号+单引号,例((((((((''))))))))
。另外mysql还可以使用括号+双引号("")
和多层括号+双引号((((((((""))))))))
以下为分别测试数值型与字符型的实际结果:
数值型 | mysql | mssql | oracle | PostgreSQL |
---|---|---|---|---|
'' | ✔ | ✔ | ✔ | ✔ |
"" | ✔ | ✘ | ✘ | ✘ |
() | ✔ | ✔ | ✔ | ✔ |
('') | ✔ | ✔ | ✔ | ✔ |
(((((((('')))))))) | ✔ | ✔ | ✔ | ✔ |
("") | ✔ | ✘ | ✘ | ✘ |
(((((((("")))))))) | ✔ | ✘ | ✘ | ✘ |
字符型 | mysql | mssql | oracle | PostgreSQL |
---|---|---|---|---|
'' | ✔ | ✔ | ✔ | ✔ |
"" | ✔ | ✘ | ✘ | ✘ |
() | ✘ | ✘ | ✘ | ✘ |
('') | ✔ | ✔ | ✔ | ✔ |
(((((((('')))))))) | ✔ | ✔ | ✔ | ✔ |
("") | ✔ | ✘ | ✘ | ✘ |
(((((((("")))))))) | ✔ | ✘ | ✘ | ✘ |
附上多层括号的测试结果图,及各数据库的注释用法(测试版本不同可能影响实际操作结果):
mysql5.6:
#单行注释
-- 单行注释(后有空格)
/*多行注释*/
ms sql server2017:
--单行注释(无空格)
/*多行注释*/
Oracle 11g R2:
/*多行注释*/
--单行注释(无空格)
REM单行注释,注释的是在它之后包含sql语句的那一行
(ps:第一次知道火狐浏览器滚动截图)
PostgreSQL 9.3:
--单行注释
/*多行注释*/
在做sqli靶场的时候会有以上闭合情况,可设置字典或手动测试闭合方式。
(注:本人菜鸡,个人见解,如有错误,欢迎评论指出)
参考文章:
各种数据库的注释
关于sql注入语句闭合的一些见解