如何删除SQL Server中奇怪的Excel字符?

有一个奇怪的空白字符,我似乎无法摆脱偶尔显示从Excel导入时,我的数据。 显而易见,它是一个空白字符,但SQL Server将其视为一个问号(ASCII 63)。

declare @temp nvarchar(255); set @temp = 'carolg@c?am.com' select @temp 

收益:

 ?carolg@c?am.com 

我怎样才能摆脱空白而不摆脱真正的问号? 如果我查看每个“?”的ASCII码 实际上,我得到63个字符,其中只有一个是真正的问题标记。

看看有类似问题的人的这个答案 。 对不起,如果这有点冗长:

SQL Server似乎通过映射不可表示的字符(没有合适的replace)到一个问号来将Unicode变成ASCII。 要复制这个,尝试打开Character Map Windows程序(应该安装在大多数机器上),selectArial作为字体,并findU + 034f“合并字形木匠”。 select这个字符,复制到剪贴板并粘贴在下面的单引号之间:

 declare @t nvarchar(10) set @t = '͏' select rtrim(ltrim(@t)) -- we can try and trim it, but by this stage it's already a '?' 

你会得到一个问号,因为它不知道如何表示这个非ASCII字符时,它将其转换为varchar 。 要强制它接受它作为一个双字节字符( nvarchar ),你需要使用N''而不是像已经提到的那样。 在上面的引号前添加一个N ,问号消失(但原始不可见字符保留在输出中 – 而ltrimrtrim将不会删除它,如下所示):

 declare @t nvarchar(10), @s varchar(10) -- note: single-byte string set @t = rtrim(ltrim(N'͏')) -- trimming doesn't work here either set @s = @t select @s -- still outputs a question mark 

导入的数据绝对可以做到这一点,我曾经见过,像上面显示的那些字符特别难以诊断,因为你看不到它们! 您将需要创build一些清理过程来删除这些unprintables(和任何其他垃圾字符),并确保您在任何地方使用nvarchar ,否则您将最终遇到此问题。 更糟糕的是,那些虚幻的问号将成为真正的问题,你将无法与合法的问题区分开来。

要查看您正在处理的字符代码,可以将其转换为varbinary,如下所示:

 declare @t nvarchar(10) set @t = N'͏test?' select cast(@t as varbinary) -- returns 0x4F0374006500730074003F00 -- Returns: -- 0x4F03 7400 6500 7300 7400 3F00 -- badchar test ? 

现在摆脱它:

 declare @t nvarchar(10) set @t = N'͏test?' select cast(@t as varbinary) -- bad char set @t = replace(@t COLLATE Latin1_General_100_BIN2, nchar(0x034f), N''); select cast(@t as varbinary) -- gone! 

注意我必须将0x4f03的字节顺序交换为0x034f (输出中出现的原因“t”为0x7400 ,而不是0x0074 )。 有关为什么我们使用二进制sorting规则的一些说明,请参阅此答案 。

这是一种混乱,因为你不知道什么是肮脏的人物,他们可能是成千上万的可能性之一。 一种select是使用like甚至是unicode() 函数对string进行迭代,并放弃不在可接受字符列表中的string,但这可能会很慢。 这可能是因为你的坏字符大部分是在string的开头或结尾,这可能会加速这个过程,如果这是一个你认为可以做的假设。

你可能需要在SQL Server的外部build立额外的进程,或者根据我上面向你展示的内容build立一个SSIS导入的一部分,以便在需要导入大量数据的时候快速地将其删除。 如果你不确定最好的方法来做到这一点,这可能是一个新的问题最好的答案。

我希望有帮助。