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 版本的功能的列表:

表 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。 应用程序必须考虑只能为宽 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 字符串。