Db2 for i CLI 中的 Unicode

Db2® for i CLI 提供數種方法,讓應用程式在其應用程式中充分運用 Unicode。

這項支援適用於兩種不同的 Unicode 編碼: UTF-8 和 UTF-16。 只有在準備 SQL 陳述式時,才支援指定 UCS-2 編碼字串。

UTF-16 編碼支援

UTF-16 編碼字元資料的支援是透過一組稱為「寬」API 的 API 來提供。 這些 API 接受作為輸入,並以輸出 UTF-16 資料傳回。 這可讓應用程式以 Unicode 編碼字集 ID (CCSID) 1200 執行,而不是相依於執行 Db2 for i CLI 工作之工作的預設 CCSID。 在大部分情況下,工作的預設 CCSID 是 EBCDIC CCSID。 由於 UTF-16 編碼字集是 UCS-2 編碼字集 (CCSID 13488) 的超集,因此應用程式也可以在 UCS-2 中編碼其字元資料。 CLI API 函數具有字尾以指出其字串引數的格式: 接受 Unicode 的引數以 W 結尾,接受 EBCDIC 的引數則沒有字尾。 下列是 Db2 for i CLI 中可用的函數清單,這些函數同時具有 EBCDIC 及 Unicode 版本:

表 1. 同時具有 EBCIDIC 和 Unicode 版本的功能清單
函數 職能 (續) 職能 (續)
SQLColAttributeW SQLColAttributesW SQLColumnPrivilegesW
SQLColumnsW SQLConnectW SQLDataSourcesW
SQLDescribeColW SQLDriverConnectW SQLErrorW
SQLExecDirectW SQLForeignKeysW SQLGetConnectAttrW
SQLGetConnectOptionW SQLGetCursorNameW SQLGetDescFieldW
SQLGetDescRecW SQLGetDiagFieldW SQLGetDiagRecW
SQLGetInfoW SQLGetPositionW SQLGetStmtAttrW
SQLGetStmtOptionW SQLGetSubStringW SQLGetTypeInfoW
SQLNativeSQLW SQLPrepareW SQLPrimaryKeysW
SQLProcedureColumnsW SQLProceduresW SQLSetConnectAttrW
SQLSetConnectOptionW SQLSetCursorNameW SQLSetDescFieldW
SQLSetStmtAttrW SQLSetStmtOptionW SQLSpecialColumnsW
SQLStatisticsW SQLTablePrivilegesW SQLTablesW

Db2 for i CLI Wide 函數的語法與其對應的 EBCDIC 函數的語法相同,但 SQLCHAR 參數定義為 SQLWCHAR。 在 EBCDIC 語法中定義為 SQLPOINTER 的字元緩衝區可以在 Unicode 函數中定義為 SQLCHAR 或 SQLWCHAR。 如需 EBCDIC 語法詳細資料,請參閱 CLI Unicode 函數的 EBCDIC 版本。

SQL 類型 SQL_WCHAR 及 SQL_WVARCHAR 可用來指定包含 Unicode 資料的緩衝區。 因此,若要指定包含 Unicode 資料的特定直欄或參數標記,應用程式可以將固定長度字元資料連結為 SQL_WCHAR ,或將可變長度字元資料連結為 SQL_WVARCHAR。 因為 UTF-16 資料是雙位元組字元資料,所以輸入及輸出長度必須將此納入考量。 具有一律為字串之引數的 Unicode 函數會將這些引數解譯為雙位元組字元數。 當長度可能參照字串或非字串資料時,該長度將解譯為儲存資料所需的位元組數。 例如, SQLGetInfoW()SQLGetInfoW () API 接受輸入長度作為位元組數,而 SQLPrepareW() 接受雙位元組字元數。

Db2 for i CLI 容許混合使用寬字元 API 和非寬字元 API。 應用程式必須考量 Unicode 資料只能指定給「廣域 API」呼叫,而不能指定給「非廣域 API」呼叫。 大部分應用程式可能想要確定以 Unicode 編碼執行,或選擇以非 Unicode 字元編碼執行,因為大部分資料將採用一致編碼。 不過,支援在相同的 CLI 環境中混合 Unicode 和非 Unicode 呼叫。 Db2 for i CLI 會限制混合使用「寬字元 API」與已啟用 UTF-8 支援的環境。 下一節將討論啟用 UTF-8 支援。

UTF-8 編碼支援

透過環境或連線屬性 SQL_ATTR_UTF8的設定,提供對 UTF-8 編碼字元資料的支援。 將屬性設為 SQL_TRUE 會指出將所有輸入及輸出資料視為 Unicode 字元資料。 此支援可讓應用程式以 Unicode 編碼字集 ID (CCSID) 1208 執行,而不是依賴執行 Db2 for i CLI 工作之工作的預設 CCSID。 UTF-8 支援不需要應用程式的任何新資料類型連結。 連結時,應用程式可以繼續將 SQL_CHAR 用於固定長度字元資料,而 SQL_VARCHAR 可用於可變長度字元資料。 當應用程式連結為任何字元 SQL 類型時, Db2 for i CLI 會使用 UTF-8 CCSID 來標記資料,因此 Db2 for i 會適當地轉換資料。 在每個 Db2 for i CLI API 上處理 UTF-8 資料,以字元資料作為輸入並傳回字元資料作為輸出。 每一個具有相符寬字元版本的 API 也支援 UTF-8 字元資料。 請參閱前一節的 API 清單,以識別哪些函數同時支援 UTF-16 及 UTF-8 Unicode 字元資料。 同時接受 UTF-8 字串及長度的函數預期長度以位元組為單位,而不是以字元為單位。 這與「廣域 API」的不同,後者在大部分情況下預期長度為雙位元組字元數。 如前一節所述,將 UTF-8 環境與對「寬字元 API」的呼叫混合在一起會受到限制。 此外,與容許 Unicode 與非 Unicode 支援 API 之間交替呼叫的寬字元 API 不同,在設定 UTF-8 環境之後,所有輸入及輸出字元資料都預期採用 Db2 for i CLI 的 UTF-8 編碼。

UCS-2 編碼支援

Db2 for i CLI 提供 UCS-2 編碼字串的部分特定支援。 此支援是在「廣域 API」支援之前新增,因此不是想要在 Db2 for i CLI 中啟用完整 Unicode 支援之應用程式的完整解決方案。 由於 UTF-16 編碼字集是 UCS-2 字集的超集,應用程式可以透過使用先前在「 Db2 for i CLI」小節中討論的「廣域 API」來取得完整 UCS-2 支援。 若要啟用此有限的 UCS-2 支援,請將連線屬性 SQL_ATTR_UCS2 設為 SQL_TRUE。 這將告知 Db2 for i CLI 在準備時將輸入字串視為 UCS-2 字元資料。 可以使用 SQLPrepare()SQLExecDirect() API 來準備 SQL 陳述式。 此支援不容許在任何其他 Db2 for i CLI API 的輸入或輸出上使用 UCS-2 字串。