主流数据库核心内置函数大全(MySQL/PostgreSQL/Oracle/SQL Server)(#含注入)
以下整理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 注入专用函数
-
ASCII(str):返回字符串第一个字符的ASCII码,用于盲注逐字符爆破 -
SUBSTR(str,pos,1):截取单个字符,配合ASCII做盲注(如ASCII(SUBSTR(database(),1,1))>97) -
ORD(str):与ASCII功能一致,可替代使用 -
IF(cond,t,f):条件判断,盲注核心(如IF(1=1,1,0)) -
SLEEP(n):延时n秒,用于时间盲注(如IF(ASCII(SUBSTR(database(),1,1))=115,SLEEP(5),0)) -
Benchmark(n,func):重复执行func n次,制造延时,替代SLEEP -
CONCAT_WS(',',col1,col2):拼接字段值,脱库时避免NULL影响(如CONCAT_WS(',',username,password)) -
GROUP_CONCAT(col):分组拼接所有结果,一次性脱库(如GROUP_CONCAT(username,password) FROM users)
(二)PostgreSQL 注入专用函数
-
ASCII(str)/CHR(n):ASCII转字符/字符转ASCII,盲注核心(互转) -
SUBSTRING(str,pos,1):截取单个字符,配合ASCII盲注 -
PG_SLEEP(n):延时n秒,时间盲注专用(MySQL的SLEEP不生效) -
CASE WHEN cond THEN t ELSE f END:条件判断,替代MySQL的IF -
STRING_AGG(col,sep):分组拼接,替代MySQL的GROUP_CONCAT(如STRING_AGG(username,',') FROM users) -
TO_CHAR(n,'999'):数值转字符串,用于拼接
(三)Oracle 注入专用函数
-
ASCII(str)/CHR(n):盲注核心,与PostgreSQL一致 -
SUBSTR(str,pos,1):截取单个字符,盲注专用 -
DBMS_LOCK.SLEEP(n):延时n秒,时间盲注(需权限,无权限时用SELECT * FROM DUAL WHERE ROWNUM<(SELECT 1 FROM DUAL CONNECT BY LEVEL<=1000000)制造延时) -
DECODE(cond,t,f):条件判断,替代IF/CASE -
WM_CONCAT(col)/LISTAGG(col,sep) WITHIN GROUP (ORDER BY col):分组拼接,脱库专用(WM_CONCAT为Oracle10g及以下,LISTAGG为11g+) -
USERENV('IP_ADDRESS'):获取客户端IP,渗透探测 -
DUAL:虚表,Oracle所有查询必须带FROM(如SELECT 1 FROM DUAL)
(四)SQL Server 注入专用函数
-
ASCII(str)/CHAR(n):盲注核心,字符与ASCII互转 -
SUBSTRING(str,pos,1):截取单个字符,盲注专用 -
WAITFOR DELAY '0:0:n':延时n秒,时间盲注(如WAITFOR DELAY '0:0:5') -
IIF(cond,t,f):2012+版本支持,替代CASE;低版本用CASE WHEN -
STUFF(col,1,0,sep)/FOR XML PATH(''):分组拼接,脱库核心(如SELECT username+','+password FROM users FOR XML PATH('')) -
@@IDENTITY:获取最后插入的自增ID,渗透探测 -
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注入指纹识别关键(一眼判断数据库类型)
-
执行
SELECT VERSION():返回结果→MySQL/PostgreSQL;无结果→Oracle/SQL Server; -
执行
SELECT @@VERSION:返回结果→SQL Server;无结果→Oracle; -
执行
SELECT 1 FROM DUAL:正常返回→Oracle;报错→其他; -
执行
SELECT SLEEP(5):延时→MySQL;报错→执行SELECT PG_SLEEP(5),延时→PostgreSQL; -
执行
WAITFOR DELAY '0:0:5':延时→SQL Server。
九、使用建议
-
日常开发:优先使用全平台通用函数(如CAST、CASE、COALESCE、CONCAT),减少数据库迁移成本;
-
SQL注入:先通过版本/延时函数做数据库指纹识别,再选择对应函数进行盲注/脱库,避免用错函数导致注入失败;
-
特殊需求:如分组拼接、延时、元信息查询,严格按数据库类型选择专用函数,这是注入成功的关键。
以上是四大主流数据库的全维度内置函数整理,覆盖开发、测试、渗透等所有常用场景,可直接作为手册备查,重点记忆「注入专用函数」和「核心差异」部分即可满足绝大多数需求。
更多推荐




所有评论(0)