【问题标题】:XML Schema totalDigits/fractionDigits vs. SQL precision/scaleXML Schema totalDigits/fractionDigits 与 SQL 精度/比例
【发布时间】:2016-02-25 23:40:10
【问题描述】:

我想找出 XML Schema totalDigits/fractionDigits 和 SQL 数值精度/小数位数之间的对应关系。

1) 假设我们有以下简单类型:

<xs:simpleType name="DecimalNumber">
    <xs:restriction base="xs:decimal">
        <xs:fractionDigits value="17"/>
        <xs:totalDigits value="18"/>
    </xs:restriction>
</xs:simpleType>

我将如何在 SQL 中表示它?让我们假设 HSQL 方言(没关系)。我对最严格的 SQL 类型感兴趣,它可以保存 XML Schema 简单类型的值空间中的所有值。

numeric(18,17)吗?还是numeric(35,17)

2) 如果我们只有totalDigits怎么办?

<xs:simpleType name="DecimalNumber">
    <xs:restriction base="xs:decimal">
        <xs:totalDigits value="18"/>
    </xs:restriction>
</xs:simpleType>

在 SQL 中什么是适当的表示?

3) 或者只是fractionDigits

<xs:simpleType name="DecimalNumber">
    <xs:restriction base="xs:decimal">
        <xs:fractionDigits value="17"/>
    </xs:restriction>
</xs:simpleType>

【问题讨论】:

    标签: sql xml xsd ddl


    【解决方案1】:

    从这一点开始:

    scale ≡ fractionDigits
    precision ≡ totalDigits
    

    在 HSQL 中:

    1. DECIMAL (35, 17) -- 编辑:fractionDigits 是一个上限;在您的情况下,从无到 17。因此,要表示的值的范围从左侧的 18 位到右侧的 17 位(小数点)。因此,您需要一个 17 位和 (18 + 17) 位数字才能表示最大值:18 位数字,没有小数位。

    2. 对 DECIMAL (18) 的天真翻译实际上意味着 18 位没有小数点,因为比例默认为 0 - 不是 XSD 的等价物。为了允许捕获所有数字,需要对 DECIMAL (36, 18) 进行编码,就域值而言,这将超过 XSD 的 18 个总数字可表示的值。您必须在此处拨打电话。

    3. 在 SQL 中,我不知道有一种方法可以在没有精度的情况下指定比例。由于 XSD 没有提供上限(它要求至少 18 个)...您可能只需要选择一个数字,可能受您的基础架构的限制(例如 MS-SQL 的最大精度为 38),或者不要一点也不麻烦(Apache 的 HsqlDB 使用无限的精度和规模)。

    【讨论】:

    • 您确定precision ≡ totalDigits 吗?我认为 12340000 有 4 个 totalDigits 但有 8 个 precision
    • 我确定。在您的示例中,尾随零很重要,因此按 totalDigits 计算。如果您会说 1234.0000(点 = 小数点),那么是的,4 位数就足够了。
    • 但是在 1) 中 9.99999999999999999 不是 DECIMAL(18,17) 允许的最大值吗?
    • @WildPottok,精度不是 totalDigits + fractionDigits。精度被简单地称为表示数字所需的总位数,带或不带小数分隔符。小数位数/小数位数是小数分隔符右侧的位数。从您最喜欢的 SQL 引擎中读取精度和比例的定义,以及从 XSD 模式类型中读取 totalDigits 和 fractionDigits 可能会有所帮助,希望它会为您清除。
    • @WildPottok,我认为您错过了范围不一致。想象一下,您定义了一个带有列 numeric(5,4) 的表。小数点分隔符左侧的 SQL 最大值将为 9,因为左侧的最大位数为 5 - 4。但是,在 XSD 中,totalDigits 5 的小数 4 可能有 99999 或 0.9999。因此,要捕获XSD range 在 SQL 列中,您必须正确配置 min-max 值。我刚刚针对 XSD 1.0 和 MS SQL 2016 测试了上述内容,行为如上所述。
    猜你喜欢
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 2018-09-17
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多