Db2 for i CLI 中的 Unicode
Db2 for i CLI 为应用程序在其应用程序中利用 Unicode 提供了多种方法。
此支持可用于两种不同的 Unicode 编码: UTF-8 和 UTF-16。 仅当准备 SQL 语句时,才支持指定 UCS-2 编码的字符串。
UTF-16 编码支持
通过一组称为 "宽" API 的 API 提供对 UTF-16 编码字符数据的支持。 这些 API 接受为输入并返回为输出 UTF-16 数据。 这允许应用程序使用 Unicode 编码字符集标识 (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。 应用程序必须考虑只能为宽 API 调用指定 Unicode 数据,而不能为非宽 API 调用指定 Unicode 数据。 大多数应用程序可能希望落实使用 Unicode 编码运行,或者选择使用非 Unicode 字符编码运行,因为大多数数据将采用一致编码。 但是,支持在同一 CLI 环境中混用 Unicode 和非 Unicode 调用。 Db2 for i CLI 会限制在已启用 UTF-8 支持的情况下混合使用宽字符 API 和环境。 下一节将讨论如何启用 UTF-8 支持。
UTF-8 编码支持
通过设置环境或连接属性 SQL_ATTR_UTF8来提供对 UTF-8 编码字符数据的支持。 将该属性设置为 SQL_TRUE 将指示所有输入和输出数据都将被视为 Unicode 字符数据。 此支持允许应用程序使用 Unicode 编码字符集标识 (CCSID) 1208 来运行,而不是依赖于运行 Db2 for i CLI 工作的作业的缺省 CCSID。 UTF-8 支持不需要应用程序进行任何新的数据类型绑定。 绑定时,应用程序可以继续将 SQL_CHAR 用于固定长度字符数据,而 SQL_VARCHAR 可用于可变长度字符数据。 当应用程序绑定为任何字符 SQL 类型时, Db2 for i CLI 将使用 UTF-8 CCSID 来标记数据,因此 Db2 for i 将正确转换数据。 UTF-8 数据在每个采用字符数据作为输入并返回字符数据作为输出的 Db2 for i CLI API 上进行处理。 具有匹配的宽字符版本的每个 API 还支持 UTF-8 字符数据。 请参阅上一节中的 API 列表,以确定哪些函数同时支持 UTF-16 和 UTF-8 Unicode 字符数据。 同时接受 UTF-8 字符串和长度的函数期望长度以字节为单位,而不是以字符为单位。 这与在大多数情况下期望长度为双字节字符数的 Wide API 相反。 如上一部分中所讨论的那样,将 UTF-8 环境与对宽字符 API 的调用混合是有限制的。 此外,与宽字符 API 不同,宽字符 API 允许在 Unicode 和非 Unicode 支持的 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 中的 Unicode" 部分中讨论的 Wide 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 字符串。