Sql server 将数据从一台服务器移动到另一台服务器时隐藏的unicode字符(MSSQLS13)-可能是排序规则问题?

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 --- --

将数据(字符(18)字段)从一个MSSQLS13移动到另一个MSSQLS13时,我会丢失“隐藏”的unicode字符

Src是丹麦人、挪威人和中国人

Tgt是SQL拉丁语通用语言

例如: 当我选择“结果到文本”时,源表中的字符(18)字段L_键显示为
'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之间可能出现的任何转换问题,否则仍然可能会出现损坏的字符。这是一个单独的问题,但仍然存在。)