sql - XML Schema totalDigits/fractionDigits 与 SQL precision/scale

标签 sql xml xsd ddl

我想找出 XML Schema totalDigits/fractionDigits 和 SQL numeric precision/scale 之间的对应关系。

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 模式简单类型的值空间中的所有值。

会是 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>

最佳答案

首先要牢记这一点:

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

关于sql - XML Schema totalDigits/fractionDigits 与 SQL precision/scale,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33878275/

相关文章:

XSD 问题 - 从另一个 xsd 调用一个 xsd

XML Schema - 如何有条件地要求地址元素? (街道、城市、州等)

mysql - 根据另一个表的查询检索一个表中的最后一个条目

java - 在循环内创建准备好的语句

java - 将 Java 代码(解谜器)适配到 Android

python - 如何使用 Python ElementTree 获取元素树的所有子元素?

java - 从 xml 中删除不需要的空格

mysql - 标量子查询

mysql - 如何使用查询结果更新我的数据库表

arrays - 在PowerShell中仅使用一个元素读取XML文件时强制使用System.Array