XML 模式 totalDigits/fractionDigits 与 SQL 精度/比例

lex*_*ore 5 xml sql ddl xsd

我想找出 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>
Run Code Online (Sandbox Code Playgroud)

我将如何在 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>
Run Code Online (Sandbox Code Playgroud)

SQL 中的适当表示是什么?

3)或者只是fractionDigits

<xs:simpleType name="DecimalNumber">
    <xs:restriction base="xs:decimal">
        <xs:fractionDigits value="17"/>
    </xs:restriction>
</xs:simpleType>
Run Code Online (Sandbox Code Playgroud)

Pet*_*dea 5

从这一点开始:

scale ? fractionDigits
precision ? totalDigits
Run Code Online (Sandbox Code Playgroud)

在 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 使用无限的精度和规模)。

  • @WildPottok,我认为你错过了范围不一致。假设您定义了一个包含 numeric(5,4) 列的表。小数点分隔符左边的 SQL 最大值将为 9,因为左边的最大位数为 5 - 4。但是,在 XSD 中,totalDigits 5,小数 4 可能为 99999 或 0.9999。因此,要捕获SQL 列中的 XSD *范围*,您必须正确配置最小-最大值。我刚刚针对 XSD 1.0 和 MS SQL 2016 测试了上述内容,行为如上所述。 (2认同)