sql-server – SQL Server – 将varchar转换为另一个归类(代码页)以修复字符编码

前端之家收集整理的这篇文章主要介绍了sql-server – SQL Server – 将varchar转换为另一个归类(代码页)以修复字符编码前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
查询使用sql_Latin1_General_CP850_BIN2排序规则的sql Server数据库.其中一个表行具有包含/ – 字符( Windows-1252代码页中的十进制代码177)的值的varchar.

当我在sql Server Management Studio中直接查询表时,我得到一个乱码字符,而不是这行中的/ – 字符.当我将此表用作SSIS包中的源时,目标表(使用典型的sql_Latin1_General_CP1_CI_AS归类)将以正确的/ – 字符结尾.

我现在必须建立一个直接查询没有SSIS的源表的机制.我如何做到这一点,我得到正确的字符,而不是乱七八糟的?我的猜测是,我需要将列转换/转换为sql_Latin1_General_CP1_CI_AS排序规则,但这并不适用于我不断获得乱码.

我没有运气尝试过以下内容

select 
columnName collate sql_Latin1_General_CP1_CI_AS
from tableName

select 
cast (columnName as varchar(100)) collate sql_Latin1_General_CP1_CI_AS
from tableName

select 
convert (varchar,columnName) collate sql_Latin1_General_CP1_CI_AS
from tableName

我究竟做错了什么?

解决方法

字符集转换在数据库连接级别上隐式完成.您可以使用参数“Auto Translate = False”在ODBC或ADODB连接字符串中强制自动转换.这不推荐
见: https://msdn.microsoft.com/en-us/library/ms130822.aspx

数据库和客户端代码页不匹配时,sql Server 2005中的代码页不兼容.
https://support.microsoft.com/kb/KbView/904803

sql-Management Console 2008及以上版本是一个UNICODE应用程序.输入或请求的所有值在应用程序级别被解释为这样.与列排序规则的对话是隐含地进行的.您可以通过以下方式验证:

SELECT CAST(N'±' as varbinary(10)) AS Result

这将返回0xB100,它是Unicode字符U 00B1(在管理控制台窗口中输入).您无法关闭Management Studio的“自动翻译”.

如果您在选择中指定了其他排序规则,则只要“自动翻译”仍处于活动状态,您最终才能双重转换(可能导致数据丢失).原始角色首先在选择期间转换为新的排序规则,然后将其自动转换为“正确”应用程序代码页.这就是为什么你的各种COLLATION测试仍然显示所有相同的结果.

如果将结果转换为VARBINARY而不是VARCHAR,则可以验证指定排序规则DOES是否在选择中有效果,因此sql Server转换在呈现之前不会被客户端无效:

SELECT cast(columnName COLLATE sql_Latin1_General_CP850_BIN2 as varbinary(10)) from tableName
SELECT cast(columnName COLLATE sql_Latin1_General_CP1_CI_AS as varbinary(10)) from tableName

如果columnName只包含字符’±’,这将分别得到0xF1或0xB1

您仍然可能会得到正确的结果,但错误的字符,如果您使用的字体不提供正确的字形.

请仔细检查您的角色的实际内部表示,将查询转换为VARBINARY一个适当的示例,并验证此代码是否确实对应于定义的数据库归类sql_Latin1_General_CP850_BIN2

SELECT CAST(columnName as varbinary(10)) from tableName

只要转换总是以相同的方式进出,应用程序归类和数据库排序规则的差异就不会被忽视.一旦您添加了不同排序规则的客户端,就会出现问题.那么您可能会发现内部转换无法正确匹配字符.

所有这一切,你应该记住,管理工作室通常不是解释结果集时的最终参考.即使MS看起来很乱,仍然可能是正确的输出.问题是您的应用程序中记录是否正确显示.

猜你在找的MsSQL相关文章