字符数据的自动转换
字符数据,如使用 SQL_C_CHAR 声明的 ANSI 字符变量或者使用 char、varchar 或 text 数据类型存储在 SQL Server 中的数据,只能表示数量有限的字符。对于每个字符使用一个字节进行存储的字符数据,它只能表示 256 个字符。使用客户端计算机的 ANSI 代码页 (ACP) 解释存储在 SQL_C_CHAR 变量中的值。对于使用 char、varchar 或 text 数据类型存储在服务器中的值,则使用服务器的 ACP 进行计算。
如果服务器和客户端使用相同的 ACP,那么在解释存储在 SQL_C_CHAR、char、varchar 或 text 对象中的值时它们不会有任何的问题。如果服务器和客户端使用不同的 ACP,则客户端中的 SQL_C_CHAR 数据在服务器上可能会解释为不同的字符(如果该数据用在 char、varchar 或 text 类型的列、变量或参数中)。例如,如果某个字符字节包含 0xA5 值,在使用代码页 437 的计算机上它将解释为字符 Ñ,而在运行代码页 1252 的计算机上它将解释为日元符号 (¥)。
Unicode 数据在存储时每个字符使用两个字节。Unicode 规范涵盖所有扩展字符,因此每一 Unicode 字符都会在所有计算机上解释为相同的字符。
SQL Server Native Client ODBC 驱动程序的 AutoTranslate 功能试图最大限度地减少在使用不同代码页的客户端和服务器之间移动字符数据时出现的问题。可以在 SQLDriverConnect 的连接字符串中和在 SQLConfigDataSource 的配置字符串中设置 AutoTranslate,或者在使用 ODBC 管理器为 SQL Server Native Client ODBC 驱动程序配置数据源时进行设置。
如果 AutoTranslate 设置为“no”,在客户端上的 SQL_C_CHAR 变量和 SQL Server 数据库中 char、varchar 或 text 类型的列、变量或参数之间移动数据时不会进行任何转换。如果数据包含扩展字符并且客户端和服务器计算机使用不同的代码页,则位模式在这两台计算机上会得到不同的解释。如果这两台计算机使用相同的代码页,则数据将得到相同的解释。
如果 AutoTranslate 设置为“yes”,则在客户端上的 SQL_C_CHAR 变量和 SQL Server 数据库中的 char、varchar 或 text 类型的列、变量或参数之间移动数据时,SQL Server Native Client ODBC 驱动程序将使用 Unicode 转换数据:
当数据从客户端上的 SQL_C_CHAR 变量发送到 SQL Server 数据库中的 char、varchar 或 text 类型的列、变量或参数时,ODBC 驱动程序首先使用客户端上的 ACP 将数据从 SQL_C_CHAR 转换到 Unicode,然后再使用服务器的 ACP 将数据从 Unicode 转换回字符。
如果数据是从 SQL Server 数据库中的 char、varchar 或 text 类型的列、变量或参数发送到客户端上的 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 客户端变量和 SQL Server 数据库中的 Unicode nchar、nvarchar 或 ntext 类型的列、变量或参数之间移动数据。
在 Unicode SQL_C_WCHAR 客户端变量和 SQL Server 数据库中的字符 char、varchar 或 text 类型的列、变量或参数之间移动数据。
在数据从字符移动到 Unicode 时,始终必须对其进行转换。