直接cast科学计数法字符串(如'1.23e+04')为decimal会失败,因decimal类型不解析'e'指数符号,仅接受纯数字字符;必须先转float/double再转decimal。

CAST(科学计数法字段 AS DECIMAL) 为什么经常失效?
因为源字段如果是 TEXT 或 VARCHAR 类型,里面存的是字符串形式的科学计数法(如 '1.23E+04'),直接 CAST(... AS DECIMAL) 在多数数据库里会报错或返回 NULL。PostgreSQL 会拒绝转换,MySQL 8.0+ 默认严格模式下也失败,SQL Server 则可能静默截断。
真正能走通的第一步,是先转成浮点数类型(FLOAT 或 REAL),再转目标精度数字:
SELECT CAST(CAST('1.23E+04' AS FLOAT) AS DECIMAL(10,2))
- 嵌套
CAST是必须的:字符串 → 浮点 → 定点 -
DECIMAL(10,2)的位数要足够容纳原始值,否则溢出变NULL或报错 - MySQL 中可简写为
CAST('1.23E+04' + 0 AS DECIMAL(10,2)),利用隐式转换绕过第一层限制
CONVERT 在 SQL Server 里怎么安全处理 E 记法?
SQL Server 的 CONVERT 对科学计数法字符串支持较好,但仍有陷阱:不指定样式参数时,CONVERT(FLOAT, '1.23E+04') 可成功,但若字符串含空格、逗号或单位(如 '1.23E+04 kg')就会失败。
稳妥做法是先清洗再转:
SELECT CONVERT(DECIMAL(12,3),
CONVERT(FLOAT,
REPLACE(REPLACE(TRIM(@str), ' ', ''), 'kg', '')))
- 必须用
TRIM()去首尾空格,否则CONVERT(FLOAT, ' 1.23E+04 ')在某些兼容级别下失败 -
REPLACE清除非数字字符(单位、符号等),否则直接报Conversion failed - 避免用
CONVERT(DECIMAL, ...)一步到位——它不识别 E 记法,只认纯数字字符串
PostgreSQL 怎么把 '1.5e-06' 变成 0.0000015?
PostgreSQL 不允许对文本直接 ::DECIMAL,但支持用 ::REAL 或 ::DOUBLE PRECISION 中转:
SELECT ('1.5e-06')::REAL::NUMERIC(10,7)
-
::REAL比::DOUBLE PRECISION精度低但够用,且转换更稳定 -
NUMERIC(10,7)小数位数必须 ≥ 科学计数法隐含的小数位(如e-06至少要 6 位),否则四舍五入丢精度 - 如果原字符串可能非法(如
'NAN'或空),得包一层NULLIF()和COALESCE()防崩
为什么转完还是显示成科学计数法?
这不是转换问题,是客户端或前端展示逻辑在作祟。数据库内部已存为普通数值,但查询工具(DBeaver、SSMS、Python pandas)默认对小数或大数启用科学计数法格式化。
- 在 PostgreSQL psql 中,用
\pset numericlocale off关闭本地化格式 - 在 Python pandas 里,设
pd.options.display.float_format = '{:.10f}'.format - 导出 CSV 时,Excel 会自动把长数字转成 E 记法——需提前把列设为「文本」格式,或加单引号前缀
真正容易被忽略的是:转换函数只管数据类型,不管显示样式;显示控制永远在下游环节。










