当我在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
我究竟做错了什么?
解决方法
见: 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看起来很乱,仍然可能是正确的输出.问题是您的应用程序中记录是否正确显示.