从SQL字段中删除特殊字符

时间:2019-01-25 14:31:27

标签: sql sql-server xml unicode special-characters

select语句中的一列具有行制表符,即&#xb。我在xml文件中使用此字段,当我在XML文件中收到错误非法字符时。在sql中有没有一种方法可以避免/替换特殊字符。

我一直在看这个链接

https://www.sqlshack.com/replace-ascii-special-characters-sql-server/

,但是想知道是否有更简单的方法可以做到这一点。

我没有运气尝试过

declare @test nvarchar(50) = 'abe&#xbprakash'
select ISNULL(REPLACE(REPLACE(REPLACE(REPLACE(@test, '!', ''), '#', ''), '$', ''), '&', ''), '') AS [Address1]
set @test = 'Peacehaven ChildrenÍs CentreMeridian Way
'
select ISNULL(REPLACE(REPLACE(REPLACE(REPLACE(@test, '!', ''), '#', ''), '$', ''), '&', ''), '') AS [Address2]

结果: Result

具有特殊字符的文本如下 “和平之路儿童中心的子午线”

1 个答案:

答案 0 :(得分:1)

阅读您的问题和所有评论都会给我一种感觉,即您对特殊字符有误解。

首先,您必须知道,SQL-Server知道两种字符串:

  • VARCHAR(这是1字节编码的扩展ASCII ,具有非常小的字符支持
  • NVARCHAR(它是2字节编码的 UCS-2 ,与UTF-16几乎相同。您可以说这是 unicode ,支持几乎所有现有角色。

非常重要:文字是-默认情况下为VARCHAR类型。将这样的文字设置为声明为NVARCHAR的变量仍将处理文字为VARCHAR。要使用NVARCHAR处理文字,需要使用前导N

尝试一下

SELECT  'Кто там?' AS RussianWithoutTheN    --??? ????
      ,N'Кто там?' AS TheSameWithTheN       --Кто там?

所以您的代码

declare @test nvarchar(50) = 'abe&#xbprakash'
set @test = 'Peacehaven ChildrenÍs CentreMeridian Way
'

...将需要N保留所有隐藏的字符...

现在有关XML:

XML是NVARCHAR的内幕,无需担心此类字符:

尝试一下:

SELECT  'Кто там?' AS RussianWithoutTheN 
      ,N'Кто там?' AS TheSameWithTheN
FOR XML PATH('Test')

结果

<Test>
  <RussianWithoutTheN>??? ????</RussianWithoutTheN>
  <TheSameWithTheN>Кто там?</TheSameWithTheN>
</Test>

但是有一些禁止字符。 XML是基于文本的容器。这意味着:

  • 有一些无法打印的字符
  • 有一些字符构成了标记(特别是<, > and &

尝试一下:

SELECT  'Some <forbidden> text' AS ReplacedEntities 
FOR XML PATH('Test')

结果:

<Test>
  <ReplacedEntities>Some &lt;forbidden&gt; text</ReplacedEntities>
</Test>

引擎必须用相应的实体替换括号。

重要事项1 :您永远不要尝试自己这样做。这是由XML引擎隐式完成的。

重要2 :读取XML会自动替换实体。永远不要自己做...

尝试一下

DECLARE @xml XML=
N'<Test>
  <ReplacedEntities>Some &lt;forbidden&gt; text</ReplacedEntities>
</Test>';

SELECT @xml.value('(/Test/ReplacedEntities/text())[1]','nvarchar(100)') 

returns "Some <forbidden> text"

您看到,引擎将为您完成所有艰苦的工作...

关于您的实际问题:您没有提供使字符串出现问题的麻烦(请避免使用图片!)。但是您可以使用N字面量或函数NCHAR()替换NVARCHAR字符以获取正确的值。否则,您只处理问号(请参见开头的示例)。

希望这对您有帮助...