目录

  • 1 字符串截取
    • 1.1 left()
    • 1.2 right()
    • 1.3 mid()
  • 2 字符串连接
    • 2.1 concat()
    • 2.2 concat_ws()
    • 2.3 group_concat()
  • 3 字符串的其他操作
    • 3.1 len()与length()
    • 3.2 field()
    • 3.3 find_inset()
    • 3.4 ord()和ascii()
    • 3.5 upper()和lower()
  • 4 数值类型函数
    • 4.1 hex()和unhex()
    • 4.2 floor()
    • 4.3 ceiling()
    • 4.4 round()
  • 5 日期类型函数
    • curdate() 和 current_date()
    • curtime() 和 current_time()
    • current_timestamp() 和 now()
  • 6 其他函数
    • 6.1 md5()
    • 6.2 load_file()
    • 6.3 banchmark()
    • 6.4 name_const()
  • 7 总结
  • 参考文献

1 字符串截取

不同类型的数据库用到的字符串截取函数可能不一样,按功能主要分为三大类:从字符串任意位置截取任意长度、从字符串左侧起获取任意长度、从字符串右侧其获取任意长度。

1.1 left()

  1. 功能:该函数用于从字符串左侧第一位起截取指定位数内容。
  2. 参数:该函数含有2个参数,第1个参数为目标字符串,第2个参数为截取长度。
SELECT left('Afghanistan',4);
/*返回值为Afgh*/

1.2 right()

  1. 功能:该函数用于从字符串右侧第一位起截取指定长度内容。
  2. 参数:该函数含有2个参数,第1个参数为目标字符串,第2个参数为截取长度。
SELECT right('Afghanistan',4);
/*返回值为stan*/

1.3 mid()

  1. 功能:该函数用于从字符串指定位置截取指定长度的内容。
  2. 参数:该函数含有3个参数,第1个参数时目标字符串;第2个参数是指定起始位置,第一位为1;第3个参数是指定长度,忽略是为截取字符串剩余全部字符。
SELECT mid('Afghanistan',4,3);
/*返回值为han*/
  1. 在Oracle数据库中,没有 MID 函数,有 substr 函数实现类似功能。

2 字符串连接

2.1 concat()

  1. 功能:将字符串 s1,s2 等多个字符串合并为一个字符串,不包含分隔符。
  2. 参数:可以包含s1、s2 到 sn 等n个目标字符串。
  3. 例子:
SELECT concat('hello','world')
/*返回helloworld*/

2.2 concat_ws()

  1. 功能:将字符串 s1,s2 等多个字符串合并为一个字符串,包含分隔符。
  2. 参数:第1个参数为指定分隔符,后续可以包含s1、s2 到 sn 等n个目标字符串。
  3. 例子:
SELECT concat_ws('-','hello','world')
/*返回hello-world*/

2.3 group_concat()

  1. 功能:将数据表中(分组后的)不同行的元素进行拼接。
  2. 语法要求:需要选择出不同的组,并将组合并,使用group_concat()函数将分组后的元素拼成一串,默认以逗号为分隔符。
  3. 例子:
    利用SQLzoo平台数据库进行练习,练习网址请点击此处,利用该数据库进行练习,将不同州的国家名拼接起来。
SELECT continent,group_concat(name)
FROM world
group by continent

3 字符串的其他操作

3.1 len()与length()

  1. 功能:LEN() 函数返回文本字段中值的长度。MySQL 中函数为 LENGTH()。
  2. 语法如下,示例参考《SQL LEN() 函数》
SELECT LEN(column_name) FROM table_name;
SELECT LENGTH(column_name) FROM table_name;

3.2 field()

  1. 功能:返回第一个字符串 s 在字符串列表(s1,s2…)中的位置。
  2. 语法及参数:FIELD(s,s1,s2…),第1个参数为目标查询的字符串,后续为字符串列表。
  3. 例子:
SELECT FIELD('c','a','b','c','d','e');
/*返回值为3*/

3.3 find_inset()

  1. 功能:返回在字符串s2中与s1匹配的字符串的位置。
  2. 语法及参数:FIND_IN_SET(s1,s2),第1个参数为目标字符串,第2个参数为查找范围。
  3. 例子:
SELECT FIND_IN_SET('c', 'a,b,c,d,e');-- 返回值为3
SELECT FIND_IN_SET('c', 'abcd,e');-- 返回值为0,表示不存在

3.4 ord()和ascii()

  1. 功能:返回字符串第1个字符对应ASCII编码。
  2. 例子:
SELECT ord('abc');			-- 返回值97
SELECT ord('a');			-- 返回值97
SELECT ascii('aba');		-- 返回值97
SELECT ascii('a');			-- 返回值97

3.5 upper()和lower()

功能:将字符串全部转化为大写或小写。

SELECT upper('Aa');		-- 返回值为AA
SELECT lower('Aa');		-- 返回值为aa

4 数值类型函数

对于数值计算类型的函数此处不再介绍,主要包括加减乘除、乘方开方对数、三角函数等类型,根据需要时再查询相应函数。

4.1 hex()和unhex()

  1. 功能:
    • hex():将一个字符串或数字转换为十六进制格式的字符串。
    • unhex():把十六进制格式的字符串转化为原来的格式。每对十六进制数字转化为一个字符。
  2. 例子如下,该函数应该是能用于构造命令来绕过一些防护检查。
SELECT hex('hello');			-- 返回值为68656C6C6F
SELECT unhex('68656C6C6F');		-- 返回值为hello

4.2 floor()

  1. 功能:向下取整,函数返回小于或等于指定值(value)的最小整数。
  2. 参数:仅含一个参数,为待取整数值。
  3. 例子:
select floor(1.55);		-- 返回值为1

4.3 ceiling()

  1. 功能:向上取整,函数返回大于或等于指定值(value)的最小整数。
  2. 参数:仅含一个参数,为待取整数值。
  3. 例子:
select ceiling(1.44);	-- 返回值为2

4.4 round()

  1. 功能:对指定精度处四舍五入取整。
  2. 参数:共有两个参数,第一个参数为待取整数值,第二个参数为精度,精度为整数表示取小数点后多少位,精度为负数表示取小数点前多少位。
  3. 例子:
select round(11.55,0);		-- 返回值为12
select round(11.55,1);		-- 返回值为11.6
select round(1.55,-1);		-- 返回值为10

5 日期类型函数

curdate() 和 current_date()

  1. 功能:都是返回当前日期。
  2. 参数:该函数不含参数。
  3. 例子:
select curdate();		-- 返回值为:Tue, 08 Feb 2022 00:00:00 GMT
select current_date();	-- 返回值为:Tue, 08 Feb 2022 00:00:00 GMT

curtime() 和 current_time()

  1. 功能:都是返回当前时间。
  2. 参数:该函数不含参数。
  3. 备注:利用SQLzoo试验时失败。

current_timestamp() 和 now()

  1. 功能:都是返回当前日期和时间。
  2. 参数:该函数不含参数。
  3. 例子:
select current_timestamp();	-- 返回值为:Tue, 08 Feb 2022 09:19:23 GMT
select now();				-- 返回值为:Tue, 08 Feb 2022 09:21:02 GMT

6 其他函数

6.1 md5()

  1. 功能:对数据进行MD5加密,返回一串hash值。
  2. 参数:待加密的数据。
  3. 例子:
    select md5(‘asdad’); – 返回值为:056f32ee5cf49404607e368bd8d3f2af

6.2 load_file()

  1. 功能:load_file()函数在获得webshell以及提权过程中起着十分重要的作用,常被用来读取各种配置文件。
  2. 待优化完善,下一阶段学习《MYSQL注入中load_file()函数的进一步应用》

6.3 banchmark()

  1. 功能:可以测试某些特定操作的执行速度。
  2. 语法:banchmark(count,expr),第一个参数为执行次数,第二个参数为指定操作。

6.4 name_const()

  1. 功能:返回给定值。 当用于生成结果集列时,NAME_CONST() 使列具有给定的名称。
  2. 语法:name_const(name,value)参数应该是常量。

7 总结

  1. 掌握以上常用函数的用法;
  2. 思考在SQL注入时这些函数能发挥什么作用?

参考文献

  1. 《MySQL 函数》建议将该文读一遍。
  2. 《MYSQL注入中load_file()函数的进一步应用》待学习研究。

更多推荐

【SQL基础】SQL常用函数简要解析