字符数据的自动转换

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

如果服务器和客户端具有相同的 ACP,则它们无法解释存储在SQL_C_CHAR、 charvarchar文本对象中的 值。 如果服务器和客户端具有不同的 ARP,则在 字符varchar文本 列、变量或参数中使用时,可以将来自客户端的数据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 设置为“no”时,不会对客户端上的 SQL_C_CHAR变量和 charvarchar文本 列、变量或参数之间移动的数据执行任何转换。 如果数据包含扩展字符,并且两台计算机具有不同的代码页,则客户端和服务器计算机上可能会以不同的方式解释位模式。 如果两台计算机具有相同的代码页,则数据将被解释为相同。

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

  • 当数据从客户端上的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 客户端变量和 SQL Server 数据库中的字符 charvarchar文本 列、变量或参数之间移动数据。

从字符移动到 Unicode 时,始终必须转换数据。

另请参阅

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