避免在DB Float列中插入指数值

时间:2016-01-13 11:45:59

标签: sql database oracle insert floating-point

我有一张像

这样的表格
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');

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

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

2 个答案:

答案 0 :(得分:3)

它不是以指数形式存储的,而是存储在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

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

你也不应该在float列中插入一个字符串,只是进行隐式转换;插入内容中的最后一个参数应为0.0000000555559080767,而不是引用的'0.0000000555559080767'

答案 1 :(得分:0)

这是显示值的方式的功能,而不是数据库中存储的内容。数据库只存储一个数字浮点值,无论如何检索和显示数据都决定了如何显示它。您提到的指数值通常用于显示此类浮点数。

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

另请注意,浮点数的精度有限,因此如果需要返回精确的数字字符串,浮点数就不是了。