字符数据的自动转换

字符数据(例如使用SQL_C_CHAR声明的 ANSI 字符变量或使用 charvarchar文本数据类型存储在 SQL Server 中的数据)只能表示有限数量的字符。 对于每个字符使用一个字节进行存储的字符数据,它只能表示 256 个字符。 使用客户端计算机的 ANSI 代码页 (ACP) 解释存储在 SQL_C_CHAR 变量中的值。 使用 charvarchar文本 数据类型在服务器上存储的值使用服务器的 ACP 进行评估。

如果服务器和客户端具有相同的 ACP,则它们在解释存储在 SQL_C_CHAR、 charvarchar文本 对象中的值方面没有问题。 如果服务器和客户端具有不同的 ACP,则在 charvarchar文本 列、变量或参数中使用来自客户端SQL_C_CHAR数据时,可能会将其解释为服务器上的不同字符。 例如,包含值0xA5的字符字节被解释为字符 ?? 使用代码页 437 的计算机上,并被解释为日元符号 (??在运行代码页 1252 的计算机上) 。

Unicode 数据在存储时每个字符使用两个字节。 Unicode 规范涵盖所有扩展字符,因此每一 Unicode 字符都会在所有计算机上解释为相同的字符。

SQL Server Native Client ODBC 驱动程序的 AutoTranslate 功能尝试最大程度地减少在客户端和具有不同代码页的服务器之间移动字符数据时出现的问题。 可以在 SQLDriverConnect 的连接字符串、SQLConfigDataSource 的配置字符串中或在使用 ODBC 管理员为 SQL Server Native Client ODBC 驱动程序配置数据源时设置 AutoTranslate。

当 AutoTranslate 设置为“否”时,不会对在客户端上的SQL_C_CHAR变量与SQL Server数据库中的 charvarchar文本列、变量或参数之间移动的数据执行转换。 如果数据包含扩展字符并且客户端和服务器计算机使用不同的代码页,则位模式在这两台计算机上会得到不同的解释。 如果这两台计算机使用相同的代码页,则数据将得到相同的解释。

当 AutoTranslate 设置为“yes”时,SQL Server Native Client ODBC 驱动程序使用 Unicode 转换在客户端上的SQL_C_CHAR变量与 SQL Server 数据库中的 charvarchar文本列、变量或参数之间移动的数据:

  • 将数据从客户端上的SQL_C_CHAR变量发送到SQL Server数据库中的 charvarchar文本列、变量或参数时,ODBC 驱动程序首先使用客户端的 ACP 从 SQL_C_CHAR 转换为 Unicode,然后使用服务器的 ACP 从 Unicode 转换回字符。

  • 当数据从SQL Server数据库中的 charvarchar文本列、变量或参数发送到客户端上的SQL_C_CHAR变量时,SQL Server Native Client ODBC 驱动程序首先使用服务器的 ACP 从字符转换为 Unicode,然后使用客户端的 ACP 从 Unicode 转换回 SQL_C_CHAR。

由于所有这些转换都是由客户端上执行的 SQL Server Native Client ODBC 驱动程序完成的,因此服务器 ACP 必须是安装在客户端计算机上的代码页之一。

通过 Unicode 对字符进行转换可确保存在于两个代码页中的所有字符都能得到正确的转换。 但是,如果存在于其中一个代码页的某个字符在另一个代码页中不存在,则该字符在目标代码页中将无法表示。 例如,代码页 1252 的注册商标符号 (??) ,而代码页 437 没有。

AutoTranslate 设置对以下转换没有任何影响:

  • 在字符SQL_C_CHAR客户端变量和 Unicode ncharnvarcharntext 列、变量或SQL Server数据库中的参数之间移动数据。

  • 在 Unicode SQL_C_WCHAR客户端变量和字符 charvarcharSQL Server 数据库中的文本列、变量或参数之间移动数据。

在数据从字符移动到 Unicode 时,始终必须对其进行转换。

另请参阅

处理结果 (ODBC)
排序规则和 Unicode 支持