AnyLine 针对 1199 系统函数 — 多数据库兼容性

全量分析 MySQL · PostgreSQL · Oracle · SQL Server · 国产数据库

一、概要

分类数量占比说明
A. 需跨数据库兼容映射~40033%同一概念在不同数据库中函数名/语法不同,AnyLine 统一抽象
B. 数据库独有~62052%仅存在于特定数据库,无跨数据库对应关系
C. SQL标准/通用~706%各数据库实现一致,无需兼容
D. 跨国产数据库兼容~343%国产数据库标签安全函数,需在达梦/金仓/神通等间兼容
空间几何(108个)、日期时间(60个)、字符串(38个)是兼容需求最密集的三大领域

二、A 类:需要跨数据库兼容映射(~400个)

这些函数在不同数据库中实现相同或相似的功能,但函数名、参数格式、返回值类型存在差异。AnyLine 统一兼容后,可一次编写、多库运行。

以下 AnyLine 枚举 仅用于函数标记,SQL 中不需要出现。写 SQL 时还是写各个库的原生函数名,如可以写 IFNULLNVL,在运行时会自动转换到运行数据库需要的格式。除非遇到有歧义的情况,如 DECODE

A1. NULL 处理(6个)

不同数据库 NULL 处理函数名完全不同,是最常见的跨数据库痛点
AnyLine 枚举说明MySQLPostgreSQLOracleSQL Server
NVL第一个非空值(2参数)IFNULLCOALESCENVLISNULL
IF_NULL_TERNARY三元NULL判断IFNULL+CASECOALESCENVL2IIF
IF_NULL_CNULL检查IFNULLCOALESCENVLISNULL
NAN_NVLNaN替换NANVL
COALESCE第一个非空值(多参数)COALESCECOALESCECOALESCECOALESCE
NULLIF相等返回NULLNULLIFNULLIFNULLIFNULLIF

A2. 类型转换(17个)

类型转换是最常见的跨数据库差异,Oracle 用 TO_* 系列,PG 用 ::CAST,MySQL/SQL Server 用 CAST/CONVERT
AnyLine 枚举说明跨数据库差异要点
CAST类型转换SQL标准但各数据库支持的类型名不同
CONVERT类型转换SQL Server/MySQL 与 PG/Oracle 语法完全不同
TO_CHAR转字符串Oracle/PG有 → SQL Server用FORMAT/STR,MySQL用DATE_FORMAT
TO_NUMBER转数字Oracle有 → 其他数据库用CAST/CONVERT
TO_DATE转日期Oracle/PG有 → MySQL用STR_TO_DATE,SQL Server用CAST
TO_TIMESTAMP转时间戳PG/Oracle有 → MySQL用CAST,SQL Server用DATEADD
TO_HEX转16进制PG有 → MySQL用HEX(),SQL Server用CONVERT
CONVERT_TZ时区转换MySQL有 → PG/SQL Server用AT TIME ZONE
TO_BASE64转 Base64MySQL 5.6+ → PG用encode(),SQL Server用FOR XML
FROM_BASE64解 Base64MySQL 5.6+ → PG用decode()
DECODE解码⚠️ Oracle DECODE 是条件函数不是解码,语义歧义!

A3. 字符串处理(38个)

字符串函数名差异是跨数据库开发最频繁遇到的痛点
AnyLine 枚举说明跨数据库差异要点
SUBSTR截取子串Oracle/PG → MySQL/SQL Server用SUBSTRING
SUBSTRING截取子串MySQL/SQL Server → Oracle/PG用SUBSTR
INSTR子串位置Oracle/MySQL → SQL Server用CHARINDEX,PG用POSITION
CHAR_INDEX子串位置SQL Server → Oracle/MySQL用INSTR
POSITION子串位置PG/SQL标准 → Oracle/MySQL用INSTR
GROUP_CONCAT分组连接MySQL → PG/SQL Server用STRING_AGG,Oracle用LISTAGG
STRING_AGG分组连接PG/SQL Server → MySQL用GROUP_CONCAT,Oracle用LISTAGG
LIST_AGG分组连接Oracle LISTAGG → MySQL用GROUP_CONCAT,PG用STRING_AGG
INSERT / INSERT_TEXT插入替换MySQL INSERT() → PG用OVERLAY,SQL Server用STUFF
OVERLAY覆盖替换SQL标准/PG → SQL Server用STUFF,MySQL用INSERT
REPEAT重复字符串MySQL/PG → SQL Server用REPLICATE
INITCAP首字母大写PG/Oracle有 → MySQL无直接对应需模拟
LPAD / RPAD左/右填充Oracle/PG/MySQL都有但参数约定不同
CONCAT连接字符串⚠️ Oracle只支持2参数,MySQL/PG支持多参数
SPLIT_PART分割取段PG → MySQL用SUBSTRING_INDEX
SUBSTRING_INDEX分割取段MySQL → PG用SPLIT_PART,其他需模拟
TRANSLATE字符替换Oracle/PG → MySQL用REPLACE无法完全替代
FORMAT格式化SQL Server → Oracle/PG用TO_CHAR,MySQL用DATE_FORMAT
TRIM去空格SQL标准但各数据库 TRIM语法差异大

A4. 日期时间(60个)

日期函数是跨数据库差异最大的领域,几乎每个函数都有不同命名
AnyLine 枚举说明跨数据库差异要点
DATE_ADD日期加MySQL → SQL Server用DATEADD,PG用+INTERVAL
DATE_SUB日期减MySQL → SQL Server用DATEDIFF,PG用-INTERVAL
DATE_DIFF日期差MySQL/SQL Server语法不同,PG用减法
DATE_FORMAT日期格式MySQL → Oracle/PG用TO_CHAR,SQL Server用FORMAT
STR_TO_DATE字符串转日期MySQL → Oracle/PG用TO_DATE
NOW当前时间MySQL/PG → SQL Server用GETDATE,Oracle用SYSDATE
SYS_DATE系统日期Oracle SYSDATE → 其他数据库用NOW/GETDATE
FROM_UNIX_TIMEUnix时间戳转换MySQL → PG用TO_TIMESTAMP,SQL Server用DATEADD
DAY / MONTH / YEAR提取日/月/年SQL标准EXTRACT替代

A5. 条件与逻辑(12个)

AnyLine 枚举说明跨数据库差异要点
IF条件判断MySQL IF() → 其他数据库用CASE
IIF三元条件SQL Server → 其他数据库用CASE
DECODE条件判断⚠️ Oracle DECODE是条件函数,PG DECODE是解码
GREATEST / LEAST最大/最小值PG/MySQL/Oracle有,SQL Server需CASE

A6. 序列与自增(8个)

AnyLine 枚举说明跨数据库差异要点
NEXTVAL序列下一值PG/Oracle → MySQL用AUTO_INCREMENT,SQL Server用IDENTITY
CURRVAL序列当前值PG/Oracle → MySQL用LAST_INSERT_ID()
LAST_INSERT_ID最后插入IDMySQL → PG用RETURNING,SQL Server用SCOPE_IDENTITY

A7. UUID(4个)

AnyLine 枚举说明跨数据库差异要点
UUID生成UUIDMySQL → PG用uuid_generate,Oracle用SYS_GUID,SQL Server用NEWID
UUID_SHORT短UUIDMySQL独有 → 其他数据库用自增或自定义

A8. 加密与哈希(11个)

AnyLine 枚举说明跨数据库差异要点
MD5MD5哈希MySQL/PG有 → SQL Server用HASHBYTES,Oracle用DBMS_CRYPTO
SHA1 / SHA2SHA哈希MySQL/PG有 → SQL Server用HASHBYTES
ENCRYPT / DECRYPT加解密各数据库实现完全不同
RANDOM随机数PG → MySQL用RAND,SQL Server用RAND,Oracle用DBMS_RANDOM

A9. 正则表达式(13个)

AnyLine 枚举说明跨数据库差异要点
REGEXP正则匹配MySQL/PG → Oracle用REGEXP_LIKE,SQL Server无原生
REGEXP_REPLACE正则替换PG/Oracle → MySQL用REGEXP_REPLACE(8.0+),SQL Server无原生
REGEXP_SUBSTR正则提取Oracle/PG → MySQL用REGEXP_SUBSTR(8.0+)

A10. 聚合与窗口(39个)

AnyLine 枚举说明跨数据库差异要点
MEDIAN中位数Oracle/PG → MySQL 8+用PERCENTILE_CONT,SQL Server用PERCENTILE_DISC
STDDEV标准差各数据库都支持但命名不同:STDDEV/STDEV/STDDEV_POP
VARIANCE方差命名差异:VARIANCE/VAR/VARP
PERCENTILE_CONT百分位SQL标准窗口 → MySQL 8+才支持

A11. 空间几何(108个)

空间函数数量最多,但大部分遵循 OGC 标准,以 ST_ 为前缀
AnyLine 枚举说明跨数据库差异要点
ST_DISTANCE空间距离OGC标准,PG/MySQL → SQL Server语法略有不同
ST_CONTAINS空间包含各数据库基本一致
ST_INTERSECTS空间相交各数据库基本一致
ST_BUFFER空间缓冲PG/MySQL → SQL Server用STBuffer
ST_AREA / ST_LENGTH面积/长度PG/MySQL → SQL Server用STArea/STLength

A12. JSON 处理(36个)

JSON 函数是近年增长最快的领域,各数据库实现差异显著
AnyLine 枚举说明跨数据库差异要点
JSON_EXTRACT提取JSON值MySQL → PG用->/->>,SQL Server用JSON_VALUE
JSON_QUERY查询JSONSQL Server → MySQL用JSON_EXTRACT
JSON_ARRAY / JSON_OBJECT构造JSONMySQL 5.7+ → PG用json_build_*
JSON_TABLEJSON转表MySQL 8+ → PG用json_to_recordset

A13. XML 处理(7个)

AnyLine 枚举说明跨数据库差异要点
XML_EXTRACT提取XMLOracle用EXTRACT → SQL Server用value()
XML_QUERYXPath查询Oracle用XMLQUERY → PG用xpath()

A14. 高级数学(29个)

AnyLine 枚举说明跨数据库差异要点
TRUNC截断Oracle → MySQL用TRUNCATE,PG用TRUNC
LOG对数参数格式因数据库而异

A15. 锁与并发(8个)

AnyLine 枚举说明跨数据库差异要点
LOCK_TABLE表锁各数据库语法完全不同
ADVISORY_LOCK咨询锁PG独有 → 其他数据库用应用层锁

A16. 布尔与判断(7个)

AnyLine 枚举说明跨数据库差异要点
IS_TRUE是否为TRUEPG → MySQL/SQL Server用=TRUE
IS_FALSE是否为FALSEPG → MySQL/SQL Server用=FALSE
IS_NULL是否NULLSQL标准 → IS NULL
IS_NOT_NULL是否非NULLSQL标准 → IS NOT NULL

A17. 位运算(5个)

AnyLine 枚举说明跨数据库差异要点
BIT_AND按位与PG/MySQL聚合 → SQL Server用&运算符
BIT_OR按位或PG/MySQL聚合 → SQL Server用|运算符
BIT_XOR按位异或PG/MySQL聚合 → SQL Server用^运算符
BIT_COUNT位计数MySQL → PG/Oracle无直接对应

三、B 类:数据库独有,无需跨数据库兼容(~620个)

这些函数仅在特定数据库中存在,没有跨数据库对应关系。不需要为它们做兼容映射,但需要正确识别并标记"在当前数据库中不可用"。

B1. PostgreSQL 独有(~350个)

Advisory Lock 咨询锁10
WAL/LSN 预写日志25
复制槽12
目录/系统视图30
权限检查 HAS_*14
数组操作 ARRAY_*21
全文搜索 TS_*19
JSONB_* 原生35
控制文件/备份8
范围类型8
XML导出12
其他PG特有~130

B2. Oracle 独有(~164个)

SYS_* 系列函数24
NLS_* 国际化9
APPROX_* 近似聚合10
PREDICTION/CLUSTER/FEATURE16
STATS_* 统计检验12
XML_* 函数24
安全标签20
类型转换特有10
其他Oracle特有~40

B3. MySQL 独有(~77个)

GROUP_REPLICATION_*10
INTERNAL_*20
ASYNCHRONOUS_FAILOVER_*5
系统信息10
字符串特有8
压缩/加密5
复制5
其他MySQL特有~14

B4. 国产数据库标签安全(34个)

需在达梦(DM)、金仓(KingBase)、神通(Oscar)、瀚高(HighGo) 间兼容

安全策略管理8
安全隔间/级别6
列级控制6
行级控制4
表级控制6
权限检查5
策略应用3

四、C 类:SQL标准/通用,各数据库一致(~70个)

这些函数遵循 SQL 标准,在主流数据库中名称和语法一致,AnyLine 不需要做兼容映射。

分类函数
基本聚合AVG, COUNT, SUM, MIN, MAX
基本数学ABS, CEIL/CEILING, FLOOR, MOD, ROUND, SIGN, SQRT, POWER/POW, EXP, LN, LOG, LOG10, PI
基本三角SIN, COS, TAN, COT, ASIN, ACOS, ATAN, ATAN2
角度转换RADIANS, DEGREES
基本字符串UPPER, LOWER, TRIM, LTRIM, RTRIM, LENGTH, CHAR_LENGTH, CHARACTER_LENGTH, OCTET_LENGTH, BIT_LENGTH, ASCII, CHR/CHAR
基本日期CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, EXTRACT, CAST
基本条件COALESCE, NULLIF, CASE, EXISTS
窗口函数RANK, DENSE_RANK, ROW_NUMBER, NTILE, LEAD, LAG, FIRST_VALUE, LAST_VALUE, CUME_DIST, PERCENT_RANK

五、分析

5.1 兼容排名(按函数数量和业务频率)

排名领域函数数业务频率优先
1空间几何108★★★统一ST_前缀,内部按数据库路由
2日期时间60★★★★★最高优先级,业务使用最频繁
3聚合与窗口39★★★★高优先级,分析场景核心
4字符串处理38★★★★★最高优先级,日常开发最常用
5JSON处理36★★★★高优先级,近年增长最快
6高级数学29★★中优先级,特定领域使用
7类型转换17★★★★★最高优先级,几乎所有SQL都涉及
8正则表达式13★★★中高优先级,数据清洗场景
9加密哈希11★★中优先级,安全场景
10XML处理7★★中优先级,集成场景

5.2 三个"不需要兼容"的判断标准

① 仅存在于一个数据库

B类 620个 → 不需要兼容映射,标记为数据库专用即可

② SQL标准各数据库一致

C类 70个 → 不需要兼容映射,直接透传

③ 语义完全不同

如 Oracle DECODE 是条件函数 vs PG DECODE 是解码 → AnyLine 统一命名消除歧义

5.3 优先完成的兼容映射 Top 10

排名AnyLine 枚举MySQLPostgreSQLOracleSQL Server业务场景
1NVL → COALESCEIFNULLCOALESCENVLISNULLNULL处理
2SUBSTRSUBSTRINGSUBSTRSUBSTRSUBSTRING字符串截取
3TO_CHARDATE_FORMATTO_CHARTO_CHARFORMAT日期格式化
4NOWNOWNOWSYSDATEGETDATE当前时间
5DATEDIFFDATEDIFF-MONTHS_BETWEENDATEDIFF日期差
6GROUP_CONCATGROUP_CONCATSTRING_AGGLISTAGGSTRING_AGG分组连接
7IFNULLIFNULLCOALESCENVLISNULLNULL替换
8INSTRINSTRPOSITIONINSTRCHARINDEX子串位置
9DATEADDDATE_ADD+INTERVAL+DATEADD日期加减
10UUIDUUIDuuid_generateSYS_GUIDNEWID唯一标识

5.4 国产数据库标签安全(B4类)的特殊价值

34个函数虽然不需要跨 MySQL/PG/Oracle 兼容,但在国产数据库间(达梦/金仓/神通/瀚高)需要兼容映射。针对信创场景深入适配:达梦、金仓、神通都支持类似的标签安全机制,但函数名有差异;AnyLine 统一命名后,应用代码可在国产数据库间无缝切换。