【问题标题】:Remove special character from SQL field从 SQL 字段中删除特殊字符
【发布时间】:2023-12-31 22:50:01
【问题描述】:

我的 select 语句中的一列具有行制表符,即 。我在 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]

结果:

带有特殊字符的文本如下 'Peacehaven Children's CentreMeridian Way'

【问题讨论】:

  • 替换功能是否无法满足您的要求。
  • REPLACE 以某种方式将成为您想要的...所以不,不是真正的 更简单 方式,除非您在前端使用REGEX
  • 没有特殊字符在Unicode中。您看到的网页使用存储在 SQL Servcer nvarchar 字段中的 Unicode,这就是为什么我可以输入 αυτό εδώ 并确保它会正确显示。
  • 请发布您的代码和表架构。 SQL Server 不会抱怨存储在 nvarchar 字段中的 any 字符。它只会抱怨存储在xml-typed 字段中的无效字符。但是,如果您尝试使用字符串连接构造查询,或者客户端应用程序存储无效 XML 然后尝试将其解析回来,您会遇到问题
  • 来自*在Tab Characters 上的文章:The vertical tab is  but is not allowed in SGML; this includes XML 1.0 and HTML.。首先,您不应该在 XML 文件中包含此序列。这不应该存储在任何人或代码期望 XML 内容的地方

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


【解决方案1】:

阅读您的问题和所有的 cmets 让我感觉,您对 特殊字符 有一种误解。

首先,你必须知道,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 是基于文本的容器。这意味着:

  • 有一些无法打印的字符
  • 标记中有一些字符(尤其是&lt;, &gt; and &amp;

试试这个:

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 字符以获得正确的值。否则,您只是在处理问号(参见开头的示例)。

希望这会有所帮助...

【讨论】:

    最近更新 更多