轉換規則
本節中的規則適用于涉及數值常值的轉換。 為了這些規則的目的,定義了下列詞彙:
存放區指派: 將資料傳送至資料庫中的資料表資料行時。 這會在呼叫 SQLExecute 、 SQLExecDirect 和 SQLSetPos 期間發生。 在存放區指派期間,「目標」是指資料庫資料行,而「來源」是指應用程式緩衝區中的資料。
擷取指派: 將資料從資料庫擷取到應用程式緩衝區時。 這會在呼叫 SQLFetch 、SQLGetData 、 SQLFetchScroll 和 SQLSetPos 期間發生。 在擷取指派期間,「目標」是指應用程式緩衝區,而「來源」則是指資料庫資料行。
CS: 字元來源中的值。
NT: 數值目標中的值。
NS: 數值來源中的值。
CT: 字元目標中的值。
精確數值常值的精確度:它所包含的位數。
精確數值常值的刻度:表示或隱含期間右邊的數位數目。
近似數值常值的精確度:其 mantissa 的有效位數。
字元來源至數值目標
以下是從字元來源 (CS) 轉換為數值目標的規則(NT):
將 CS 取代為藉由移除 CS 中任何前置或尾端空格所取得的值。 如果 CS 不是有效的 數值常值 ,則會傳回 SQLSTATE 22018(轉換規格的字元值無效)。
將 CS 取代為取值,方法是移除小數點之前的前置零、小數點之後的尾端零或兩者。
將 CS 轉換為 NT。 如果轉換導致有效位數遺失,則會傳回 SQLSTATE 22003(超出範圍的數值)。 如果轉換導致非顯著數位遺失,則會傳回 SQLSTATE 01S07 (小數截斷)。
數位來源到字元目標
以下是從數值來源 (NS) 轉換為字元目標的規則(CT):
讓 LT 成為 CT 字元的長度。 若要擷取指派,LT 等於字元中的緩衝區長度減去此字元集 Null 終止字元中的位元組數目。
例:
如果 NS 是確切的數數值型別,則讓 YP 等於符合精確數值 常值定義的 最短字元字串,讓 YP 小數位數與 NS 小數位數相同,而 YP 的解譯值為 NS 的絕對值。
如果 NS 是近似數數值型別,則讓 YP 成為字元字串,如下所示:
案例:
如果 NS 等於 0,則 YP 為 0。
讓 YSN 成為符合精確 數值常值 定義且解譯值為 NS 絕對值的最短字元字串。 如果 YSN 的長度小於 NS 資料類型的 ( precision + 1),則讓 YP 等於 YSN。
否則,YP 是最短的字元字串,符合近似數值常值的定義 ,其解譯值是 NS 的絕對值,且 其 mantissa 是由非 '0' 的單 一位數 所組成,後面接著句 號和 不帶正負號的整數 。
案例:
如果 NS 小於 0,則讓 Y 成為下列結果:
'-' ||Yp
其中 '||' 是字串串連運算子。
否則,讓 Y 等於 YP。
讓 LY 成為 Y 字元的長度。
案例:
如果 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。