问答详情
源自:4-1 Oracle 操作表中的数据

number(p,s) s为负数为什么用不了

代码部分:

SQL> desc test1123

Name   Type          Nullable Default Comments 

------ ------------- -------- ------- -------- 

ID     INTEGER       Y                         

NAME   NCHAR(8)      Y                         

SALARY NUMBER(6,-8)  Y                         

JOB    NVARCHAR2(10) Y                 

SQL> insert into test1123 (name,job,salary,id) values ('hello','水电费水电费萨顶顶',23.2,2);

1 row inserted

SQL> select * from test1123;

                                     ID NAME                SALARY JOB

--------------------------------------- ----------------- -------- ---------------------

                                      2 hello                    0 水电费水电费萨顶顶

改为 number(6,2)就能写入了,但这个和number(6,-8)不是同一个意思吗

提问者:180416 2018-11-23 11:36

个回答

  • weixin_慕仔650547
    2018-11-23 17:12:32
    已采纳

    第二个参数为负数时,以number(6,-2)为例,表示有效位6位,取整至小数点前2位,例子中如果输入123456则结果为123500,注意有四舍五入。 你的例子中-8的绝对值大于6,于是6位有效位被全部截掉并取整为0,所以最终结果为0

  • 陈晨辰_
    2019-04-04 15:15:06

    Oracle中数据类型number(m,n)中m表示的是所有有效数字的位数,n表示的是小数位的位数。m的范围是1-38,即最大38位。

        1> .NUMBER类型细讲:
    oracle   number   datatype   语法:NUMBER[(precision   [, scale])]
    简称:precision   -->   p 
              scale   -->   s

    NUMBER(p,   s)
    范围:   1   <=   p   <= 38, 

           -84   <=   s   <= 127
            保存数据范围: -1.0e-130   <= number value  <   1.0e+126        
    保存在机器内部的范围:   1   ~   22   bytes

    有效位:从左边第一个不为0的数算起的位数。
    s的情况:
    s   >   0
          精确到小数点右边s位,并四舍五入。然后检验有效位是否   <=   p。
    s   <   0
          精确到小数点左边s位,并四舍五入。然后检验有效位是否   <=   p   +   |s|。
    s   =   0
          此时NUMBER表示整数。


  • 180416
    2018-11-25 17:59:57

    谢谢回答,刚刚试了下,的确如此,但是老师在《3-2 oracle管理表之数据类型》里讲的是:number(p,s)中如果s为负数的时候,那么它就表示从最大有效数字到小数点的位数,不知道是不是我理解错了