Sql server 将数据从一台服务器移动到另一台服务器时隐藏的unicode字符(MSSQLS13)-可能是排序规则问题?
将数据(字符(18)字段)从一个MSSQLS13移动到另一个MSSQLS13时,我会丢失“隐藏”的unicode字符 Src是丹麦人、挪威人和中国人 Tgt是SQL拉丁语通用语言 例如: 当我选择“结果到文本”时,源表中的字符(18)字段L_键显示为Sql server 将数据从一台服务器移动到另一台服务器时隐藏的unicode字符(MSSQLS13)-可能是排序规则问题?,sql-server,unicode,Sql Server,Unicode,将数据(字符(18)字段)从一个MSSQLS13移动到另一个MSSQLS13时,我会丢失“隐藏”的unicode字符 Src是丹麦人、挪威人和中国人 Tgt是SQL拉丁语通用语言 例如: 当我选择“结果到文本”时,源表中的字符(18)字段L_键显示为'9060001429 00099' 当我选择“结果到网格”时,它显示为'9060001429' 当我查看具体示例及其单个字符及其unicode编号时,我得到以下信息: Pos UnicodeChar UnicodeValue --- --
'9060001429 00099'
当我选择“结果到网格”时,它显示为'9060001429'
当我查看具体示例及其单个字符及其unicode编号时,我得到以下信息:
Pos UnicodeChar UnicodeValue
--- ----------- ------------
1 9 57
2 0 48
3 6 54
4 0 48
5 0 48
6 0 48
7 1 49
8 4 52
9 2 50
10 9 57
11 0
12 0
13 0
14 0 48
15 0 48
16 0 48
17 9 57
18 9 57
因此,位置11、12和13似乎都有一个空值
当我将数据选择到同一服务器上具有相同排序规则的表中时;我得到了同样的结果
当我用SQL拉丁语1\u General\u CP1\u CI\u将数据选择到另一台服务器上的表中时,我失去了上述示例中的位置11-18
我尝试在目标数据库中创建一个表,该表的列与源列具有相同的排序规则,并尝试使用SSIS导入/导出向导移动数据
如果我在SSIS导入/导出wizrad中的查询中使用显式转换
(convert(nvarchar(18),L_键))我可以在SSIS预览窗口中看到“缺少”字符。然而,当数据插入到目标表中时,字符就消失了
请帮忙
注意。我不能使用openrowset或链接服务器。
字符(18)字段
这是您的问题。这是一个单一的代码页类型。使用nchar(13)
将字符串存储为Unicode并避免所有转换问题。否则,无法转换为目标代码页的字符将丢失。代码页实际上是由排序规则控制的。CONVERT(VARBINARY(MAX),L_键)
提供了什么?如果字符串中有实际的NUL字符,那么确实会有一个相当严重的问题,因为许多T-SQL函数和客户端都不喜欢这一点——传统上NUL是C和类似语言中的字符串终止符。你不应该照搬这些东西,而应该把它们全部扔掉。您可以通过使用Latin1\u General\u BIN
排序规则来实现这一点,该排序规则确实尊重NUL(在一定程度上)并可用于替换NUL。此外,在这种情况下,没有隐藏的Unicode字符char
不是Unicode类型。这是不兼容代码页之间的一个简单转换错误。CONVERT(VARBINARY(MAX),L_KEY)给了我:0x393036303031343239000003030303939
是的,这些是真正的蓝色数值。用火杀死他们--REPLACE(L_KEY COLLATE Latin1_General_BIN,CHAR(0),“”)COLLATE DATABASE_DEFAULT
应该这样做。如果您真的想完整地复制它们,我不知道您是否可以使用SSI来实现这一点——很可能只是通过二进制类型反弹所有内容,以避免任何和所有字符串处理。(考虑使用Unicode类型仍然是一个好主意,可以避免丹麦/挪威代码页和拉丁语-1之间可能出现的任何转换问题,否则仍然可能会出现损坏的字符。这是一个单独的问题,但仍然存在。)