【问题标题】:Avoid inserting exponential value in DB Float column避免在 DB Float 列中插入指数值
【发布时间】:2016-01-13 11:45:59
【问题描述】:

我有一张这样的桌子

CONTACT

Name                           Null     Type                                                                                                                                                                                          
------------------------------ -------- -----------
CONTACT_ID                     NOT NULL NUMBER                                                                                                                                                                                        
NAME                           NOT NULL VARCHAR2(45)                                                                                                                                                                                  
EMAIL                          NOT NULL VARCHAR2(45)                                                                                                                                                                                  
ADDRESS                        NOT NULL VARCHAR2(45)                                                                                                                                                                                  
TELEPHONE                      NOT NULL VARCHAR2(45)                                                                                                                                                                                  
AMOUNT                         NOT NULL FLOAT(126) 

插入语句为:

Insert into  contact("CONTACT_ID","NAME","EMAIL","ADDRESS","TELEPHONE","AMOUNT")
values ('36','babusailesh1117777','hainatu1@gmail.com','Vietnam1',
  '0904277091','0.0000000555559080767');

当我看到插入数据库的最终值时,我看到了一个指数值。

如何在所有表的数据库级别避免这种情况?

【问题讨论】:

  • 是的。我做到了。但没有变化。

标签: sql database oracle insert floating-point


【解决方案1】:

它不是以指数形式存储的,而是以 Oracle 的内部数字表示形式存储的。当您查询它时,它会以您会话的当前数字格式显示:

select 0.0000000555559080767 from dual;

                  0.0000000555559080767
---------------------------------------
                                5.6E-08

您可以在 SQL*Plus 或 SQL Developer 中覆盖:

set numformat 999.9999999999999999999
select 0.0000000555559080767 from dual;

   0.0000000555559080767
------------------------
    .0000000555559080767

或将值显式格式化为字符串,仅用于显示:

set numf ""
select to_char(0.0000000555559080767, '9990.9999999999999999999') from dual;

TO_CHAR(0.000000055555908
-------------------------
    0.0000000555559080767

如果您有一个客户端应用程序检索并使用该值,那么它应该将其作为浮点数查询,并转换为适合客户端语言的数据类型,然后由客户端决定如何显示。


您也不应该将字符串插入到浮点列中,这只是进行隐式转换;插入中的最后一个参数应该是 0.0000000555559080767 而不是引用的 '0.0000000555559080767'

【讨论】:

  • 同意我不应该使用单引号。但是,当我运行 set numformat 999.9999999999999999999 时,我得到 ORacle 错误 ORA-00922
  • 来自哪个客户?如果它不是我提到的两个之一,您可能需要以其他方式更改首选项。
  • Oracle SQL 开发者:版本 1.0.0.12 无论如何我会尝试使用 sqlplus 通过命令提示符连接到数据库。
  • 谢谢亚历克斯。使用直接连接到 oracle 工作,无需使用 SQL 开发人员等工具
  • 那是 SQL Developer 的一个古老版本。它适用于我使用过的所有最新版本;当前是 4.1。
【解决方案2】:

这是值显示方式的函数,而不是数据库中存储的内容。数据库只存储一个数字浮点值,检索和显示数据的任何内容决定如何显示它。您提到的指数值对于显示此类浮点数很常见。

您可以让 Oracle 返回以某种方式格式化的字符串,以便使用诸如 to_char 之类的函数来设置格式。但是,在使用数据库的任何程序或代码中处理此问题可能更有意义。

还请注意,浮点数的精度有限,因此如果您需要取回准确的数字字符串,浮点数不是可行的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 2014-07-31
    • 2017-07-23
    • 1970-01-01
    相关资源
    最近更新 更多