AnyLine 针对 1199 系统函数 — 多数据库兼容性
全量分析 MySQL · PostgreSQL · Oracle · SQL Server · 国产数据库
一、概要
| 分类 | 数量 | 占比 | 说明 |
|---|---|---|---|
| A. 需跨数据库兼容映射 | ~400 | 33% | 同一概念在不同数据库中函数名/语法不同,AnyLine 统一抽象 |
| B. 数据库独有 | ~620 | 52% | 仅存在于特定数据库,无跨数据库对应关系 |
| C. SQL标准/通用 | ~70 | 6% | 各数据库实现一致,无需兼容 |
| D. 跨国产数据库兼容 | ~34 | 3% | 国产数据库标签安全函数,需在达梦/金仓/神通等间兼容 |
空间几何(108个)、日期时间(60个)、字符串(38个)是兼容需求最密集的三大领域
二、A 类:需要跨数据库兼容映射(~400个)
这些函数在不同数据库中实现相同或相似的功能,但函数名、参数格式、返回值类型存在差异。AnyLine 统一兼容后,可一次编写、多库运行。
以下 AnyLine 枚举 仅用于函数标记,SQL 中不需要出现。写 SQL 时还是写各个库的原生函数名,如可以写IFNULL或NVL,在运行时会自动转换到运行数据库需要的格式。除非遇到有歧义的情况,如DECODE。
A1. NULL 处理(6个)
不同数据库 NULL 处理函数名完全不同,是最常见的跨数据库痛点
| AnyLine 枚举 | 说明 | MySQL | PostgreSQL | Oracle | SQL Server |
|---|---|---|---|---|---|
| NVL | 第一个非空值(2参数) | IFNULL | COALESCE | NVL | ISNULL |
| IF_NULL_TERNARY | 三元NULL判断 | IFNULL+CASE | COALESCE | NVL2 | IIF |
| IF_NULL_C | NULL检查 | IFNULL | COALESCE | NVL | ISNULL |
| NAN_NVL | NaN替换 | — | — | NANVL | — |
| COALESCE | 第一个非空值(多参数) | COALESCE | COALESCE | COALESCE | COALESCE |
| NULLIF | 相等返回NULL | NULLIF | NULLIF | NULLIF | NULLIF |
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 | 转 Base64 | MySQL 5.6+ → PG用encode(),SQL Server用FOR XML |
| FROM_BASE64 | 解 Base64 | MySQL 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_TIME | Unix时间戳转换 | 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 | 最后插入ID | MySQL → PG用RETURNING,SQL Server用SCOPE_IDENTITY |
A7. UUID(4个)
| AnyLine 枚举 | 说明 | 跨数据库差异要点 |
|---|---|---|
| UUID | 生成UUID | MySQL → PG用uuid_generate,Oracle用SYS_GUID,SQL Server用NEWID |
| UUID_SHORT | 短UUID | MySQL独有 → 其他数据库用自增或自定义 |
A8. 加密与哈希(11个)
| AnyLine 枚举 | 说明 | 跨数据库差异要点 |
|---|---|---|
| MD5 | MD5哈希 | MySQL/PG有 → SQL Server用HASHBYTES,Oracle用DBMS_CRYPTO |
| SHA1 / SHA2 | SHA哈希 | 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 | 查询JSON | SQL Server → MySQL用JSON_EXTRACT |
| JSON_ARRAY / JSON_OBJECT | 构造JSON | MySQL 5.7+ → PG用json_build_* |
| JSON_TABLE | JSON转表 | MySQL 8+ → PG用json_to_recordset |
A13. XML 处理(7个)
| AnyLine 枚举 | 说明 | 跨数据库差异要点 |
|---|---|---|
| XML_EXTRACT | 提取XML | Oracle用EXTRACT → SQL Server用value() |
| XML_QUERY | XPath查询 | 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 | 是否为TRUE | PG → MySQL/SQL Server用=TRUE |
| IS_FALSE | 是否为FALSE | PG → MySQL/SQL Server用=FALSE |
| IS_NULL | 是否NULL | SQL标准 → IS NULL |
| IS_NOT_NULL | 是否非NULL | SQL标准 → 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 | ★★★★★ | 最高优先级,日常开发最常用 |
| 5 | JSON处理 | 36 | ★★★★ | 高优先级,近年增长最快 |
| 6 | 高级数学 | 29 | ★★ | 中优先级,特定领域使用 |
| 7 | 类型转换 | 17 | ★★★★★ | 最高优先级,几乎所有SQL都涉及 |
| 8 | 正则表达式 | 13 | ★★★ | 中高优先级,数据清洗场景 |
| 9 | 加密哈希 | 11 | ★★ | 中优先级,安全场景 |
| 10 | XML处理 | 7 | ★★ | 中优先级,集成场景 |
5.2 三个"不需要兼容"的判断标准
① 仅存在于一个数据库
B类 620个 → 不需要兼容映射,标记为数据库专用即可
② SQL标准各数据库一致
C类 70个 → 不需要兼容映射,直接透传
③ 语义完全不同
如 Oracle DECODE 是条件函数 vs PG DECODE 是解码 → AnyLine 统一命名消除歧义
5.3 优先完成的兼容映射 Top 10
| 排名 | AnyLine 枚举 | MySQL | PostgreSQL | Oracle | SQL Server | 业务场景 |
|---|---|---|---|---|---|---|
| 1 | NVL → COALESCE | IFNULL | COALESCE | NVL | ISNULL | NULL处理 |
| 2 | SUBSTR | SUBSTRING | SUBSTR | SUBSTR | SUBSTRING | 字符串截取 |
| 3 | TO_CHAR | DATE_FORMAT | TO_CHAR | TO_CHAR | FORMAT | 日期格式化 |
| 4 | NOW | NOW | NOW | SYSDATE | GETDATE | 当前时间 |
| 5 | DATEDIFF | DATEDIFF | - | MONTHS_BETWEEN | DATEDIFF | 日期差 |
| 6 | GROUP_CONCAT | GROUP_CONCAT | STRING_AGG | LISTAGG | STRING_AGG | 分组连接 |
| 7 | IFNULL | IFNULL | COALESCE | NVL | ISNULL | NULL替换 |
| 8 | INSTR | INSTR | POSITION | INSTR | CHARINDEX | 子串位置 |
| 9 | DATEADD | DATE_ADD | +INTERVAL | + | DATEADD | 日期加减 |
| 10 | UUID | UUID | uuid_generate | SYS_GUID | NEWID | 唯一标识 |
5.4 国产数据库标签安全(B4类)的特殊价值
34个函数虽然不需要跨 MySQL/PG/Oracle 兼容,但在国产数据库间(达梦/金仓/神通/瀚高)需要兼容映射。针对信创场景深入适配:达梦、金仓、神通都支持类似的标签安全机制,但函数名有差异;AnyLine 统一命名后,应用代码可在国产数据库间无缝切换。