代码之家  ›  专栏  ›  技术社区  ›  njvb

数据库字段定义

  •  2
  • njvb  · 技术社区  · 14 年前

    我需要从数据库进行数据迁移,我对数据库不太熟悉,所以我想澄清一下。我有一些文档可以应用于Oracle或SQL数据库,它有一个列定义为数字(10,5)。我想知道这是什么意思。我想这意味着这个数字有10位,小数点后5位,但我想澄清一下。同样,对于SQL或Oracle,这会有所不同吗?

    3 回复  |  直到 14 年前
        1
  •  4
  •   JonH    14 年前

    第一个数字是精度,第二个数字是比例。SQL Server中的等效项可以是十进制/数字,您可以这样定义它:

    DECLARE @MyDec decimal(18,2)
    

    18是可以存储的最大小数位数总数。 (即总位数,例如123.45,这里的精度为5,而刻度为2) . 2是小数位数,它指定存储在小数点右侧的最大位数。

    this article

    请记住,存储字节的大小越大,精度越高。因此,如果可能的话,尽量减少。

    P(精度)

    指定的最大总数 可存储的十进制数字, 左右两侧 小数点。精度必须 从1到最大值 精度。最大精度为 38。默认精度为18。

    S(比例尺)

    指定的最大数目 可存储到的十进制数字 小数点的右边。规模 必须是从0到P的值。 只有在以下情况下才能指定比例: 精度已指定。默认值 比例为0;因此,0<=s<=p。 最大存储大小根据 精度。

    最后,值得一提的是,在Oracle中,您可以定义一个比精度更大的比例,例如数字(3,10)在Oracle中是有效的。另一方面,SQL Server要求精度>=scale。所以,如果您在Oracle中定义了数字(3,10),它将作为数字(10,10)映射到SQL中。

        2
  •  1
  •   OMG Ponies    14 年前

    在Oracle中将列定义为数字(10,5),意味着列值的小数可以精确到5位,总长度为10位。如果在没有定义小数点的列中插入值,则该列支持的最大值为10位。例如,定义为数字(10,5)的列将支持这些值:

    1234567890
     12345.67890
    

    这让验证很痛苦。

    MySQL和SQL Server不支持数字数据类型—要支持小数,您需要使用十进制(或float?).我没有看过PostgreSQL,但我认为它与Oracle相似。

        3
  •  1
  •   Philippe    14 年前

    在Oracle中,定义为数字(4,5)的列要求小数点后的第一位为零,并将所有值舍入到小数点后的第五位。

    Oracle documentation

    NUMBER(p,s)
    

    式中:P为精度,或 总位数。甲骨文公司 保证数字的可移植性 精度从1到38。S 是小数位数或位数 小数点右边。这个 刻度范围从-84到127。

    以下是一些例子:

    实际数据 .000127 存储在 NUMBER(4,5) 变成 .00013

    实际数据 7456123.89 存储在 NUMBER(7,-2) 变成 7456100

    编辑

    Jonh提到了一些值得注意的事情:

    Oracle允许缩放精度, 因此,SQL将映射它,以便如果S>P 然后p变成s,这就是数字(3,4) 在Oracle中,在SQL中变为数字(4,4)。