POW / SQRT / LOG 是什么
POW(x, y)(与 POWER 同义)求 x 的 y 次方,SQRT(x) 求平方根,LOG 系列求对数。差异集中在对数函数上:MySQL 的单参数 LOG(x) 是自然对数、LOG(b, x) 指定底数;PostgreSQL 的 ln(x) 才是自然对数,单参数 log(x) 是十进制对数。SQRT 传负数时 MySQL 返回 NULL,PostgreSQL 直接报错。这些函数大多返回浮点类型,业务计算里不要用等值比较。
基本信息
| MySQL 幂与根 | POW(x,y) / POWER(x,y) / SQRT(x),SQRT 传负数返回 NULL |
|---|---|
| MySQL 对数 | LOG(x) 为自然对数,LOG(b, x) 指定底数 |
| PostgreSQL 幂与根 | pow(x,y) / power(x,y) / sqrt(x),sqrt 传负数直接报错 |
| PostgreSQL 对数 | ln(x) 自然对数,log(x) 十进制对数,log(b, x) 指定底数 |
| 返回类型 | 多为双精度浮点;需要精确值时应改用 DECIMAL 运算 |
典型使用场景
- 复利、折现与增长率计算
- 距离计算:欧氏距离与平方和开根
- 指数增长与衰减模型拟合
- 对数刻度转换,用于图表展示与打分归一化
- 容量与费用估算:按幂次增长的存储或流量外推
- 对数量级差异大的指标先取对数再比较,避免极值主导分析
MySQL 用法
MySQL 用法
SELECT POW(2, 10) AS p1, # 1024
POWER(2, 10) AS p2, # 1024,与 POW 等价
SQRT(144) AS s1, # 12
LOG(2.718281828) AS ln_approx, # 单参数 LOG 是自然对数
LOG(10, 1000) AS log_10; # 指定底数,结果为 3PostgreSQL 用法
PostgreSQL 用法
-- 对数函数分工不同,写法不能直接照搬
SELECT ln(2.718281828) AS natural_log, -- 自然对数
log(1000) AS log10_value, -- 单参数 log 是十进制对数
log(10, 1000) AS log_base, -- 指定底数
pow(2, 10) AS p,
sqrt(144) AS s;
-- 欧氏距离:先平方求和再开根
SELECT sqrt(power(x2 - x1, 2) + power(y2 - y1, 2)) AS dist FROM points;函数对照
| 函数 | MySQL | PostgreSQL |
|---|---|---|
| 幂 | POW / POWER | pow / power |
| 平方根 | SQRT(x),负数返回 NULL | sqrt(x),负数报错 |
| 自然对数 | LOG(x) | ln(x) |
| 十进制对数 | LOG(10, x) | log(x) |
| 指定底数对数 | LOG(b, x) | log(b, x) |
MySQL 与 PostgreSQL 的 LOG 语义不同:MySQL 单参数 LOG(x) 是自然对数,PostgreSQL 单参数 log(x) 是十进制对数,迁移时最稳的写法是显式指定底数或使用 ln。
浮点结果不能做等值比较:POW 与 SQRT 返回近似值(例如 SQRT(2) 的平方不严格等于 2),判断相等应使用误差范围,或改用 DECIMAL 类型计算。
展示前先控制精度:幂与对数的结果通常带一长串小数,用 ROUND(x, 2) 之类的写法收口,既便于阅读,也避免把浮点噪声当成真实差异。
对数与开方都有定义域限制:LOG 的参数必须为正数,传 0 或负数时 MySQL 返回 NULL、PostgreSQL 报错;上线前先对输入列做范围校验,别等线上语句报错才发现。