Oracle中to_number转换超15位数字输出科学计数法如何返回原始数字
问题本质
Oracle中to_number返回的是NUMBER类型的精确值,输出指数形式不是函数计算错误,是Oracle客户端、查询工具的默认数值显示规则导致的:当数值有效位数超过15位时,默认渲染逻辑会自动转成科学计数法展示,数值本身没有丢失精度。
可行方案
- 方案1:显式用
to_char指定全数字格式转字符串返回(最稳妥,不受客户端工具、会话参数影响)
针对示例的SQL,调整写法如下,格式模型中9的数量和待处理数字的长度对齐即可:
执行后直接返回原始完整数字-- 加fm前缀可以去掉结果前的补位空格 select to_char(to_number('5131427328503192','9999999999999999'), 'fm9999999999999999') as full_number from dual;5131427328503192,不会出现指数格式。如果需要处理带小数的数字,在格式模型里对应加上小数点、小数位的9占位即可。 - 方案2:修改当前会话的数值显示参数
执行以下语句修改会话级配置,后续当前连接下的数值查询都会按指定格式展示,不会自动转科学计数法,注意格式长度要匹配你需要展示的最大数字长度:
该配置仅对当前连接生效,断开重连后会恢复默认值。alter session set nls_numeric_characters = '.,'; alter session set nls_number_format = 'fm99999999999999999999'; - 方案3:修改第三方查询工具的显示配置
如果使用PL/SQL Developer、Navicat、DBeaver这类工具查询,可以直接在工具偏好设置里找到数值类型显示相关配置,关闭科学计数法自动转换,将数值最大显示位数调整为38位(对应Oracle NUMBER类型的最大精度),设置后查询结果会直接展示完整数字。
注意:Oracle的NUMBER类型最高支持38位有效数字,如果待处理的数字长度超过38位,不要用
to_number转成数值类型,否则会出现精度截断,这类超长数字(比如超长订单号、ID号)建议直接用字符串类型存储处理。
内容的提问来源于stack exchange,提问作者Alok Jyoti Bal
相关产品推荐
相关产品推荐

