如何删除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
,问号消失(但原始不可见字符保留在输出中 – 而ltrim
和rtrim
将不会删除它,如下所示):
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导入的一部分,以便在需要导入大量数据的时候快速地将其删除。 如果你不确定最好的方法来做到这一点,这可能是一个新的问题最好的答案。
我希望有帮助。