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 版本:
| 函數 | 職能 (續) | 職能 (續) |
|---|---|---|
| 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 字串。