以下整理MySQL、PostgreSQL、Oracle、SQL Server四大主流数据库的高频内置函数,按字符串、数值、日期时间、聚合、系统/安全、SQL注入常用函数分类,标注各数据库支持情况及差异,同时补充函数的核心用法和适用场景,兼顾日常开发与渗透测试需求,内容详细且易对照。

一、字符串函数(最常用,处理字符/文本操作)

函数功能 MySQL PostgreSQL Oracle SQL Server 通用说明
求字符串长度 LENGTH(str) LENGTH(str)
CHAR_LENGTH(str)
LENGTH(str) LEN(str) 部分数据库区分字节/字符长度,如PostgreSQL中LENGTH按字节、CHAR_LENGTH按字符
字符串拼接 CONCAT(s1,s2,…)
CONCAT_WS(sep,s1,s2,…)
CONCAT(s1,s2,…)
s1
s2 s1
截取子串 SUBSTRING(str,pos,len)
SUBSTR(str,pos,len)
SUBSTRING(str,pos,len)
SUBSTR(str,pos,len)
SUBSTR(str,pos,len)
SUBSTRING(str,pos,len)
SUBSTRING(str,pos,len) pos从1开始;省略len则截取到末尾
转大写 UPPER(str)
UCASE(str)
UPPER(str)
UCASE(str)
UPPER(str)
UPPERCASE(str)
UPPER(str) 全平台通用逻辑,无差异
转小写 LOWER(str)
LCASE(str)
LOWER(str)
LCASE(str)
LOWER(str)
LOWERCASE(str)
LOWER(str) 全平台通用逻辑,无差异
去除首尾空格 TRIM(str)
LTRIM/RTRIM
TRIM(str)
LTRIM/RTRIM
TRIM(str)
LTRIM/RTRIM
TRIM(str)
LTRIM/RTRIM
TRIM可指定去除的字符,如TRIM(0 FROM ‘0012300’)
替换字符串 REPLACE(str,old,new) REPLACE(str,old,new) REPLACE(str,old,new) REPLACE(str,old,new) 全平台通用,替换所有匹配项
查找子串位置 INSTR(str,sub) POSITION(sub IN str)
STRPOS(str,sub)
INSTR(str,sub) CHARINDEX(sub,str) 找到返回起始位置(1开始),未找到返回0
反转字符串 REVERSE(str) REVERSE(str) REVERSE(str) REVERSE(str) 全平台通用
填充字符串(左/右) LPAD/RPAD(str,len,pad) LPAD/RPAD(str,len,pad) LPAD/RPAD(str,len,pad) LPAD/RPAD(str,len,pad) 长度不足时,用pad字符填充至指定长度

二、数值函数(处理数字计算、取整、随机数等)

函数功能 MySQL PostgreSQL Oracle SQL Server 通用说明
绝对值 ABS(n) ABS(n) ABS(n) ABS(n) 全平台通用
四舍五入 ROUND(n,dec) ROUND(n,dec) ROUND(n,dec) ROUND(n,dec) dec为小数位数,省略则取整
向下取整(地板函数) FLOOR(n) FLOOR(n) FLOOR(n) FLOOR(n) 取小于等于n的最大整数
向上取整(天花板函数) CEIL(n)
CEILING(n)
CEIL(n)
CEILING(n)
CEIL(n)
CEILING(n)
CEILING(n) 取大于等于n的最小整数
取模(取余数) MOD(n,m)
n%m
MOD(n,m)
n%m
MOD(n,m) n % m 结果符号与被除数一致
随机数 RAND()
RAND(seed)
RANDOM() DBMS_RANDOM.VALUE()
DBMS_RANDOM.VALUE(min,max)
RAND(seed) MySQL/RANDOM无参返回0-1浮点数;Oracle可指定范围
幂运算 POW(n,m)
POWER(n,m)
POWER(n,m) POWER(n,m) POWER(n,m) 计算n的m次方
平方根 SQRT(n) SQRT(n) SQRT(n) SQRT(n) 仅支持非负数
取绝对值/符号 SIGN(n) SIGN(n) SIGN(n) SIGN(n) 正数返回1,负数返回-1,0返回0
截取小数(舍去) TRUNCATE(n,dec) TRUNC(n,dec) TRUNC(n,dec) ROUND(n,dec,1) 直接截取小数,不四舍五入

三、日期时间函数(处理时间戳、日期计算、格式转换)

函数功能 MySQL PostgreSQL Oracle SQL Server 通用说明
获取当前日期 CURDATE()
CURRENT_DATE
CURRENT_DATE
CURDATE()
SYSDATE
TRUNC(SYSDATE)
GETDATE()
CAST(GETDATE() AS DATE)
返回格式:YYYY-MM-DD
获取当前时间 CURTIME()
CURRENT_TIME
CURRENT_TIME
CURTIME()
SYSDATE
TO_CHAR(SYSDATE,‘HH24:MI:SS’)
GETDATE()
CAST(GETDATE() AS TIME)
返回格式:HH:MM:SS
获取当前日期时间 NOW()
SYSDATE()
CURRENT_TIMESTAMP
NOW()
CURRENT_TIMESTAMP
SYSDATE
CURRENT_TIMESTAMP
GETDATE()
SYSDATETIME()
包含日期+时间,部分支持毫秒
日期格式化 DATE_FORMAT(dt, fmt) TO_CHAR(dt, fmt) TO_CHAR(dt, fmt) CONVERT(VARCHAR,dt,fmt)
FORMAT(dt,fmt)
格式符差异大,如MySQL用%Y,Oracle/SQL Server用YYYY
字符串转日期 STR_TO_DATE(str, fmt) TO_DATE(str, fmt) TO_DATE(str, fmt) CAST(str AS DATE)
CONVERT(DATE,str)
需指定与字符串匹配的格式
日期加减天数 DATE_ADD(dt,INTERVAL n DAY)
DATE_SUB(dt,INTERVAL n DAY)
dt + n::INTEGER
dt - n::INTEGER
dt + n
dt - n
DATEADD(DAY,n,dt) PostgreSQL需指定类型转换
求两个日期差(天) DATEDIFF(dt1,dt2) (dt1 - dt2)::INTEGER TRUNC(dt1 - dt2) DATEDIFF(DAY,dt2,dt1) 注意参数顺序,部分数据库dt1-dt2,部分相反
提取年/月/日/时/分/秒 YEAR/MONTH/DAY/HOUR/MINUTE/SECOND(dt) EXTRACT(YEAR FROM dt)
DATE_PART(‘year’,dt)
EXTRACT(YEAR FROM dt)
TO_NUMBER(TO_CHAR(dt,‘YYYY’))
DATEPART(YEAR,dt)
YEAR(dt)
PostgreSQL的DATE_PART支持更细粒度(如星期)
获取时间戳(秒) UNIX_TIMESTAMP(dt) EXTRACT(EPOCH FROM dt) (dt - TO_DATE(‘1970-01-01’,‘YYYY-MM-DD’))*86400 DATEDIFF(SECOND,‘1970-01-01’,dt) 基于1970-01-01 00:00:00的秒数
时间戳转日期 FROM_UNIXTIME(ts) TO_TIMESTAMP(ts) TO_DATE(‘1970-01-01’,‘YYYY-MM-DD’) + ts/86400 DATEADD(SECOND,ts,‘1970-01-01’) 与上面函数互转

四、聚合函数(分组统计,配合GROUP BY使用,全平台通用度高)

函数功能 MySQL PostgreSQL Oracle SQL Server 通用说明
计数 COUNT(*)
COUNT(col)
COUNT(DISTINCT col)
同MySQL 同MySQL 同MySQL COUNT(*)统计所有行,COUNT(col)忽略NULL,DISTINCT去重
求和 SUM(col) 同MySQL 同MySQL 同MySQL 仅对数值类型生效,忽略NULL
求平均值 AVG(col) 同MySQL 同MySQL 同MySQL 自动忽略NULL值
求最大值 MAX(col) 同MySQL 同MySQL 同MySQL 支持数值/日期/字符串(按字符序)
求最小值 MIN(col) 同MySQL 同MySQL 同MySQL 与MAX规则一致
去重后求和/平均 SUM(DISTINCT col)
AVG(DISTINCT col)
同MySQL 同MySQL 同MySQL 先去重再计算,适用于避免重复统计
分组内累加(窗口函数) SUM(col) OVER(PARTITION BY grp ORDER BY dt) 同MySQL 同MySQL 同MySQL 全平台均支持,替代传统子查询累加
统计标准差/方差 STDDEV(col)
VARIANCE(col)
STDDEV_SAMP(col)
VAR_SAMP(col)
STDDEV(col)
VARIANCE(col)
STDEV(col)
VAR(col)
分为样本/总体统计,部分数据库有细分函数

五、系统/安全函数(获取数据库元信息、用户、权限,SQL注入高频)

函数功能 MySQL PostgreSQL Oracle SQL Server 注入/开发说明
获取当前数据库名 DATABASE() CURRENT_DATABASE() SYS_CONTEXT(‘USERENV’,‘CURRENT_SCHEMA’) DB_NAME() 注入中用于爆当前库
获取当前登录用户名 USER()
CURRENT_USER()
CURRENT_USER
USER
USER
CURRENT_USER
SYSTEM_USER
USER_NAME()
注入中用于爆数据库用户
获取数据库版本 VERSION() VERSION() SELECT * FROM V$VERSION
DBMS_DB_VERSION.VERSION
@@VERSION 注入中用于指纹识别(判断数据库类型)
获取数据库服务器IP/主机名 @@hostname inet_server_addr()
inet_server_name()
SYS_CONTEXT(‘USERENV’,‘SERVER_HOST’) HOST_NAME()
@@SERVERNAME
注入中用于探测服务器信息
获取当前会话ID CONNECTION_ID() pg_backend_pid() SYS_CONTEXT(‘USERENV’,‘SID’) @@SPID 用于会话管理/渗透探测
查看所有数据库名 SHOW DATABASES
SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
SELECT datname FROM pg_database SELECT NAME FROM V$DATABASE
SELECT SCHEMA_NAME FROM ALL_SCHEMATA
SELECT name FROM sys.databases 注入中爆库名核心函数
查看库下所有表名 SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=DATABASE() SELECT tablename FROM pg_tables WHERE schemaname=CURRENT_DATABASE() SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER=USER SELECT name FROM sys.tables WHERE SCHEMA_ID=SCHEMA_ID(DB_NAME()) 注入中爆表名核心函数
查看表下所有字段名 SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=‘表名’ SELECT attname FROM pg_attribute WHERE attrelid=‘表名’::regclass AND attnum>0 SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS WHERE TABLE_NAME=‘表名’ AND OWNER=USER SELECT name FROM sys.columns WHERE object_id=OBJECT_ID(‘表名’) 注入中爆字段名核心函数

六、SQL注入专用函数(渗透测试高频,区分数据库指纹/脱库)

这部分是SQL注入中最核心的数据库区分依据,不同数据库的函数差异是指纹识别和脱库的关键,单独整理高频函数:

(一)MySQL 注入专用函数

  1. ASCII(str):返回字符串第一个字符的ASCII码,用于盲注逐字符爆破

  2. SUBSTR(str,pos,1):截取单个字符,配合ASCII做盲注(如ASCII(SUBSTR(database(),1,1))>97

  3. ORD(str):与ASCII功能一致,可替代使用

  4. IF(cond,t,f):条件判断,盲注核心(如IF(1=1,1,0)

  5. SLEEP(n):延时n秒,用于时间盲注(如IF(ASCII(SUBSTR(database(),1,1))=115,SLEEP(5),0)

  6. Benchmark(n,func):重复执行func n次,制造延时,替代SLEEP

  7. CONCAT_WS(',',col1,col2):拼接字段值,脱库时避免NULL影响(如CONCAT_WS(',',username,password)

  8. GROUP_CONCAT(col):分组拼接所有结果,一次性脱库(如GROUP_CONCAT(username,password) FROM users

(二)PostgreSQL 注入专用函数

  1. ASCII(str)/CHR(n):ASCII转字符/字符转ASCII,盲注核心(互转)

  2. SUBSTRING(str,pos,1):截取单个字符,配合ASCII盲注

  3. PG_SLEEP(n):延时n秒,时间盲注专用(MySQL的SLEEP不生效)

  4. CASE WHEN cond THEN t ELSE f END:条件判断,替代MySQL的IF

  5. STRING_AGG(col,sep):分组拼接,替代MySQL的GROUP_CONCAT(如STRING_AGG(username,',') FROM users

  6. TO_CHAR(n,'999'):数值转字符串,用于拼接

(三)Oracle 注入专用函数

  1. ASCII(str)/CHR(n):盲注核心,与PostgreSQL一致

  2. SUBSTR(str,pos,1):截取单个字符,盲注专用

  3. DBMS_LOCK.SLEEP(n):延时n秒,时间盲注(需权限,无权限时用SELECT * FROM DUAL WHERE ROWNUM<(SELECT 1 FROM DUAL CONNECT BY LEVEL<=1000000)制造延时)

  4. DECODE(cond,t,f):条件判断,替代IF/CASE

  5. WM_CONCAT(col)/LISTAGG(col,sep) WITHIN GROUP (ORDER BY col):分组拼接,脱库专用(WM_CONCAT为Oracle10g及以下,LISTAGG为11g+)

  6. USERENV('IP_ADDRESS'):获取客户端IP,渗透探测

  7. DUAL:虚表,Oracle所有查询必须带FROM(如SELECT 1 FROM DUAL

(四)SQL Server 注入专用函数

  1. ASCII(str)/CHAR(n):盲注核心,字符与ASCII互转

  2. SUBSTRING(str,pos,1):截取单个字符,盲注专用

  3. WAITFOR DELAY '0:0:n':延时n秒,时间盲注(如WAITFOR DELAY '0:0:5'

  4. IIF(cond,t,f):2012+版本支持,替代CASE;低版本用CASE WHEN

  5. STUFF(col,1,0,sep)/FOR XML PATH(''):分组拼接,脱库核心(如SELECT username+','+password FROM users FOR XML PATH('')

  6. @@IDENTITY:获取最后插入的自增ID,渗透探测

  7. SYSUTCDATETIME():获取UTC时间,替代GETDATE()

七、通用函数(跨数据库兼容,条件判断/空值处理)

函数功能 MySQL PostgreSQL Oracle SQL Server 通用说明
空值判断/替换 IFNULL(col,val) COALESCE(col,val) NVL(col,val) ISNULL(col,val)
COALESCE(col,val)
COALESCE全平台支持,可多参数(返回第一个非NULL)
条件判断(简单) IF(cond,t,f) CASE WHEN cond THEN t ELSE f END DECODE(cond,t,f)
CASE
IIF(cond,t,f)
CASE
CASE为全平台通用,无版本限制
条件判断(多分支) CASE WHEN c1 THEN t1 WHEN c2 THEN t2 ELSE f END 同MySQL 同MySQL 同MySQL 全平台通用,复杂条件首选
类型转换 CAST(col AS type)
CONVERT(type,col)
CAST(col AS type)
CONVERT(col,type)
CAST(col AS type)
TO_NUMBER/TO_CHAR/TO_DATE
CAST(col AS type)
CONVERT(type,col)
常用转换:DATE/INT/VARCHAR
去重 DISTINCT col 同MySQL 同MySQL 同MySQL 全平台通用,可多字段去重

八、各数据库函数核心差异总结(重点记忆,避免踩坑)

1. 最易混淆的核心差异

  • 拼接符:MySQL用CONCAT,Oracle/PostgreSQL用||,SQL Server用+;

  • 延时函数:MySQL(SLEEP)、PostgreSQL(PG_SLEEP)、Oracle(DBMS_LOCK.SLEEP)、SQL Server(WAITFOR DELAY);

  • 分组拼接:MySQL(GROUP_CONCAT)、PostgreSQL(STRING_AGG)、Oracle(LISTAGG/WM_CONCAT)、SQL Server(FOR XML PATH);

  • 空值替换:MySQL(IFNULL)、Oracle(NVL)、SQL Server(ISNULL),COALESCE全平台通用

  • 长度函数:SQL Server用LEN,其他三者用LENGTH;

  • 虚表:仅Oracle需要FROM DUAL,其他数据库可直接SELECT 1

2. SQL注入指纹识别关键(一眼判断数据库类型)

  1. 执行SELECT VERSION():返回结果→MySQL/PostgreSQL;无结果→Oracle/SQL Server;

  2. 执行SELECT @@VERSION:返回结果→SQL Server;无结果→Oracle;

  3. 执行SELECT 1 FROM DUAL:正常返回→Oracle;报错→其他;

  4. 执行SELECT SLEEP(5):延时→MySQL;报错→执行SELECT PG_SLEEP(5),延时→PostgreSQL;

  5. 执行WAITFOR DELAY '0:0:5':延时→SQL Server。

九、使用建议

  1. 日常开发:优先使用全平台通用函数(如CAST、CASE、COALESCE、CONCAT),减少数据库迁移成本;

  2. SQL注入:先通过版本/延时函数做数据库指纹识别,再选择对应函数进行盲注/脱库,避免用错函数导致注入失败;

  3. 特殊需求:如分组拼接、延时、元信息查询,严格按数据库类型选择专用函数,这是注入成功的关键。

以上是四大主流数据库的全维度内置函数整理,覆盖开发、测试、渗透等所有常用场景,可直接作为手册备查,重点记忆「注入专用函数」和「核心差异」部分即可满足绝大多数需求。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐