字符数据的自动转换
适用于:SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics Analytics 平台系统(PDW)
字符数据(如使用字符、varchar 或文本数据类型在 SQL Server 中存储SQL_C_CHAR声明的 ANSI 字符变量)只能表示有限数量的字符。 对于每个字符使用一个字节进行存储的字符数据,它只能表示 256 个字符。 使用客户端计算机的 ANSI 代码页 (ACP) 解释存储在 SQL_C_CHAR 变量中的值。 使用服务器的 ACP 评估使用 char、 varchar 或 文本 数据类型存储的值。
如果服务器和客户端具有相同的 ACP,则它们在解释存储在SQL_C_CHAR、char、varchar 或文本对象中的值时没有问题。 如果服务器和客户端具有不同的 ARP,则如果客户端在 char、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变量和 char、varchar 或文本列、变量或参数之间移动的数据执行任何转换。 如果数据包含扩展字符并且客户端和服务器计算机使用不同的代码页,则位模式在这两台计算机上会得到不同的解释。 如果这两台计算机使用相同的代码页,则数据将得到相同的解释。
当 AutoTranslate 设置为“yes”时,SQL Server Native Client ODBC 驱动程序使用 Unicode 转换在客户端和 char、varchar 或文本列、变量或参数 SQL_C_CHAR之间移动的数据:
当数据从客户端上的SQL_C_CHAR变量发送到 SQL Server 数据库中的 char、varchar 或文本列、变量或参数时,ODBC 驱动程序首先使用客户端的 ACP 从 SQL_C_CHAR 转换为 Unicode,然后使用服务器的 ACP 从 Unicode 转换回字符。
当数据从 SQL Server 数据库中的 char、 varchar 或 文本 列、变量或参数发送到客户端上的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 nchar、nvarchar 或 ntext 列、变量或 SQL Server 数据库中的参数之间移动数据。
在 Unicode SQL_C_WCHAR 客户端变量与 SQL Server 数据库中的文本列、变量或参数之间移动数据。
在数据从字符移动到 Unicode 时,始终必须对其进行转换。