轉換規則

本節中的規則適用于涉及數值常值的轉換。 為了這些規則的目的,定義了下列詞彙:

  • 存放區指派: 將資料傳送至資料庫中的資料表資料行時。 這會在呼叫 SQLExecute SQLExecDirect SQLSetPos 期間發生。 在存放區指派期間,「目標」是指資料庫資料行,而「來源」是指應用程式緩衝區中的資料。

  • 擷取指派: 將資料從資料庫擷取到應用程式緩衝區時。 這會在呼叫 SQLFetch 、SQLGetData SQLFetchScroll SQLSetPos 期間發生。 在擷取指派期間,「目標」是指應用程式緩衝區,而「來源」則是指資料庫資料行。

  • CS: 字元來源中的值。

  • NT: 數值目標中的值。

  • NS: 數值來源中的值。

  • CT: 字元目標中的值。

  • 精確數值常值的精確度:它所包含的位數。

  • 精確數值常值的刻度:表示或隱含期間右邊的數位數目。

  • 近似數值常值的精確度:其 mantissa 的有效位數。

字元來源至數值目標

以下是從字元來源 (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 等於符合精確數值 常值定義的 最短字元字串,讓 YP 小數位數與 NS 小數位數相同,而 YP 的解譯值為 NS 的絕對值。

    • 如果 NS 是近似數數值型別,則讓 YP 成為字元字串,如下所示:

      案例:

      如果 NS 等於 0,則 YP 為 0。

      讓 YSN 成為符合精確 數值常值 定義且解譯值為 NS 絕對值的最短字元字串。 如果 YSN 的長度小於 NS 資料類型的 ( precision + 1),則讓 YP 等於 YSN。

      否則,YP 是最短的字元字串,符合近似數值常值的定義 ,其解譯值是 NS 的絕對值,且 其 mantissa 是由非 '0' 的單 一位數 所組成,後面接著句 號和 不帶正負號的整數

  3. 案例:

    • 如果 NS 小於 0,則讓 Y 成為下列結果:

      '-' ||Yp

      其中 '||' 是字串串連運算子。

      否則,讓 Y 等於 YP。

  4. 讓 LY 成為 Y 字元的長度。

  5. 案例:

    • 如果 LY 等於 LT,則 CT 會設定為 Y。

    • 如果 LY 小於 LT,則 CT 會設定為 Y,由適當的空格數目擴充到右邊。

      否則,請將 > Y 的第一個 LT 字元複製到 CT。

      案例:

      如果這是存放區指派,則傳回錯誤 SQLSTATE 22001 (字串資料,右截斷)。

      如果這是擷取指派,則傳回警告 SQLSTATE 01004 (字串資料,右截斷)。 當複製導致小數位數遺失(尾端零以外的數位),則驅動程式定義是否發生下列其中一項:

      (1) 驅動程式會將 Y 中的字串截斷為適當的小數位數(也可以為零),並將結果寫入 CT。

      (2) 驅動程式會將 Y 中的字串四捨五入為適當的小數位數(也可以為零),並將結果寫入 CT。

      (3) 驅動程式既不會截斷也不會四捨五入,而只是將 Y 的第一個 LT 字元複製到 CT。