从 SQL Server varchar 列中删除奇怪的字符(带帽子的 A)

Posted

技术标签:

【中文标题】从 SQL Server varchar 列中删除奇怪的字符(带帽子的 A)【英文标题】:Remove weird characters ( A with hat) from SQL Server varchar column 【发布时间】:2015-10-19 23:46:42 【问题描述】:

一些奇怪的字符被存储在其中一张表中。它们似乎来自.csv 提要,所以我对此没有太多控制权。

Hello Kitty Essential Accessory Kit

我怎样才能清理它并删除这些字符。我可以在数据库级别或 C# 中这样做。

编辑

根据 cmets 收到的建议。我也在研究我可以做些什么来在饲料水平上纠正它。这里有更多关于它的信息。

    Feed 来自第三方。 我在 notepad++ 中打开了提要并检查了编码菜单,我看到了点 在'encode in ansi'前面,所以我相信这是 文件 这就是它在记事本++“Hello Kitty”中的显示方式 必备配件套件” 虽然有一件奇怪的事情。当我在 powershell 中搜索该行时 .csv 文件。它提出了这一行。我没有看到这些奇怪的东西 那里的字符..

【问题讨论】:

一个疯狂的猜测是 CSV 使用自定义双引号(“”而不是“”)并且您在数据库连接中使用的编码/字符集不同,导致它们显示为Ã 和 Â。也许你可以在你的数据库连接字符串中添加一个编码参数来防止这种情况发生。 明确地说,您想要完全删除这些字符,而不是仅仅删除其中的变音符号? @Damien_The_Unbeliever 是的,我可以完全删除这些字符,所以它会给我留下“Hello Kitty Essential Accessory Kit” 什么是奇怪的字符?也许你可以定义它的 ascii 范围从 195 到 x 或类似的东西 同意@C.Evenhuis:是一些奇怪的编码问题。我认为是一个典型的案例,不从这个根源解决问题,以后会出问题 【参考方案1】:

您可以使用.net 正则表达式函数。例如,使用Regex.Replace

Regex.Replace(s, @"[^\u0000-\u007F]", string.Empty);

由于SQL Server 不支持正则表达式,您需要创建一个SQL CLR 函数。有关SQL Server 中的.net 集成的更多信息,请参见此处:

String Utility Functions Sample - 完整的工作示例 Stairway to SQLCLR - 仍在进行中 Introduction to SQL Server CLR Integration - 官方文档

在你的情况下:

    打开Visual Studio并创建Class Library Project

    然后将该类重命名为***,并将以下代码粘贴到其文件中:

    using Microsoft.SqlServer.Server;
    using System;
    using System.Collections.Generic;
    using System.Data.SqlTypes;
    using System.Linq;
    using System.Text;
    using System.Text.RegularExpressions;
    using System.Threading.Tasks;
    
    public class ***
    
        [SqlFunction(DataAccess = DataAccessKind.None, IsDeterministic = true, Name = "RegexReplace")]
        public static SqlString Replace(SqlString sqlInput, SqlString sqlPattern, SqlString sqlReplacement)
        
            string input = (sqlInput.IsNull) ? string.Empty : sqlInput.Value;
            string pattern = (sqlPattern.IsNull) ? string.Empty : sqlPattern.Value;
            string replacement = (sqlReplacement.IsNull) ? string.Empty : sqlReplacement.Value;
            return new SqlString(Regex.Replace(input, pattern, replacement));
        
    
    

    现在,构建项目。打开SQL Server Management Studio。选择您的数据库并替换以下FROM 子句的路径值以匹配您的***.dll

    CREATE ASSEMBLY [***] FROM 'C:\Users\gotqn\Desktop\***\***\bin\Debug\***.dll';
    

    最后,创建SQL CLR函数:

    CREATE FUNCTION [dbo].[***RegexReplace] (@input NVARCHAR(MAX),@pattern NVARCHAR(MAX), @replacement NVARCHAR(MAX))
    RETURNS NVARCHAR(4000)
    AS EXTERNAL NAME [***].[***].[Replace]
    GO
    

您已准备好在您的T-SQL 语句中直接使用RegexReplace .net 函数:

    SELECT [dbo].[***RegexReplace] ('Hello Kitty Essential Accessory Kit', '[^\u0000-\u007F]', '')

    //Hello Kitty Essential Accessory Kit

【讨论】:

接受这个作为答案可能让我可以灵活地在 Sql Server 或 c# 级别实现它。【参考方案2】:

如果您只在字符串中查找字母和数字,this 可以帮助您。

在此,Regex 用于替换除字母和数字以外的所有字符。

【讨论】:

不是真正的字母和数字.. 我只需要删除这些看起来很奇怪的字符,保留其他所有内容.. 我已经提供了链接,这些链接现在作为答案发布,不知道为什么我被否决了。 仅链接的答案不受欢迎。在这种情况下,您应该简单地投票 - 重复。或者最多将其作为评论发布。 @Luaan 我没有权利这样做,否则我肯定会投反对票 @TirthakShah 好吧,在你这样做之前避免这样的问题。这里有很多问题(和回答者),跳过那些你无法回答/否决/关闭的问题并没有错。【参考方案3】:

这似乎有效:

string input = "Hello Kitty Essential Accessory Kit";
string res = Regex.Replace(input, @"[^a-zA-Z0-9\s]", "");

Console.WriteLine(res); // Hello Kitty Essential Accessory Kit

【讨论】:

有点太急于恕我直言,你删除 .,;这也可以在现场。从一般的角度来看,有时 Â 甚至可能是该领域的实际部分......问题必须解决 CSV 方面恕我直言 @w.b 你能修改你的答案以包括.;:拜托。那应该可以作为我的答案.. 事实上包括我们在键盘上看到的所有字符。【参考方案4】:

试试这个:

DECLARE @str VARCHAR(400)
    DECLARE @expres  VARCHAR(50) = '%[~,@,#,$,%,&,*,(,),.,!,Ã,Â]%'
      SET @str = 'Hello Kitty Essential Accessory Kit'
      WHILE PATINDEX( @expres, @str ) > 0
          SET @str = Replace(REPLACE( @str, SUBSTRING( @str, PATINDEX( @expres, @str ), 1 ),''),'-',' ')

      SELECT @str

只需在 @expres 变量中添加您想要删除的任何特殊字符。

希望这会有所帮助!

【讨论】:

以上是关于从 SQL Server varchar 列中删除奇怪的字符(带帽子的 A)的主要内容,如果未能解决你的问题,请参考以下文章

使用 SQL Server 在 varchar 列中查找非 ASCII 字符

从 SQL Server 中的 VARCHAR 中删除非数字字符的最快方法

从 SQL Server 中的所有列中删除引号

SQL server 数据类型 - Date VS Varchar(n)

如何从表列中删除唯一约束?

在 SQL Server 中检索 VARCHAR 列的最大长度