转换规则

本节中的规则适用于涉及数字文本的转换。 就这些规则而言,定义了以下术语:

  • 应用商店分配: 将数据发送到数据库中的表列时。 这发生在调用 SQLExecuteSQLExecDirectSQLSetPos 期间。 在存储分配期间,“目标”是指数据库列,“源”是指应用程序缓冲区中的数据。

  • 检索分配: 将数据从数据库检索到应用程序缓冲区时。 在调用 SQLFetchSQLGetDataSQLFetchScrollSQLSetPos 期间会发生此情况。 在检索分配期间,“目标”表示应用程序缓冲区,“源”表示数据库列。

  • Cs: 字符源中的值。

  • Nt: 数值目标中的值。

  • Ns: 数值源中的值。

  • Ct: 字符目标中的值。

  • 精确数字文本的精度:它包含的位数。

  • 精确数值文本的小数位数:明示或隐含句点右侧的位数。

  • 近似数值文本的精度:其尾数的精度。

字符源到数字目标

以下是从字符源 (CS) 转换为数字目标 (NT) 的规则:

  1. 将 CS 替换为通过删除 CS 中任何前导空格或尾随空格获得的值。 如果 CS 不是有效的 数值文本,则 SQLSTATE 22018 (强制转换规范) 返回无效字符值。

  2. 将 CS 替换为通过删除小数点前面的前导零和/或小数点后的尾随零获得的值。

  3. 将 CS 转换为 NT。 如果转换导致有效位数丢失,则返回 SQLSTATE 22003 (数值超过范围) 。 如果转换导致非显著数字丢失,则返回 SQLSTATE 01S07 (小数截断) 。

数字源到字符目标

以下是从数值源 (NS) 转换为 CT) 字符目标 (规则:

  1. 让 LT 是 CT 字符的长度。 对于检索分配,LT 等于缓冲区的长度(以字符为单位),减去此字符集的 null 终止字符中的字节数。

  2. 例:

    • 如果 NS 是精确数值类型,则让 YP 等于符合 exact-numeric-literal 定义的最短字符串,以便 YP 的小数位数与 NS 的小数位数相同,YP 的解释值是 NS 的绝对值。

    • 如果 NS 是近似数值类型,则让 YP 成为字符串,如下所示:

      大小写:

      如果 NS 等于 0,则 YP 为 0。

      让 YSN 成为符合精确数值文本 定义的最短字符串,其解释值为 NS 的绝对值。 如果 YSN 的长度小于 NS 数据类型的 (精度 + 1) ,则让 YP 等于 YSN。

      否则,YP 是符合 近似数值文本 定义的最短字符串,其解释值为 NS 的绝对值,其 数由非“0”的一 位数 组成,后跟 句点无符号整数

  3. 大小写:

    • 如果 NS 小于 0,则让 Y 成为以下结果:

      '-' ||Yp

      其中,“||”是字符串串联运算符。

      否则,让 Y 等于 YP。

  4. 让 LY 是 Y 字符的长度。

  5. 大小写:

    • 如果 LY 等于 LT,则 CT 设置为 Y。

    • 如果 LY 小于 LT,则 CT 设置为 Y,并按适当的空格数在右侧扩展。

      否则, (LY > LT) ,请将 Y 的前 LT 字符复制到 CT 中。

      大小写:

      如果这是存储分配,则返回错误 SQLSTATE 22001 (字符串数据,右截断) 。

      如果这是检索分配,则返回警告 SQLSTATE 01004 (字符串数据,) 右截。 当复制导致小数位数丢失 (除尾随零) 外,由驱动程序定义是否发生以下情况之一:

      (1) 驱动程序将 Y 中的字符串截断为适当的小数位数 (该刻度也可以为零,) 并将结果写入 CT。

      (2) 驱动程序将 Y 中的字符串舍入到适当的刻度 (该刻度也可以为零,) 并将结果写入 CT。

      (3) 驱动程序既不截断也不舍入,而只是将 Y 的前 LT 字符复制到 CT 中。