加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql-server – SQL Server – 将varchar转换为另一个归类(代码页

发布时间:2020-12-12 16:52:54 所属栏目:MsSql教程 来源:网络整理
导读:我查询使用SQL_Latin1_General_CP850_BIN2排序规则的SQL Server数据库.其中一个表行具有包含/ – 字符( Windows-1252代码页中的十进制代码177)的值的varchar. 当我在SQL Server Management Studio中直接查询表时,我得到一个乱码字符,而不是这行中的/ – 字符.
我查询使用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看起来很乱,仍然可能是正确的输出.问题是您的应用程序中记录是否正确显示.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读