SQL Server空格处理

本文对比分析了SQLServer和C#在处理包含char(9)字符的数据时的不同表现,解释了为何SQLServer的ltrim和rtrim函数仅能去除char(32)字符,而C#能够更全面地移除多种非char(32)的空格。通过演示代码和MSDN资料,深入探讨了不同编程环境对空格字符的处理方式。
部署运行你感兴趣的模型镜像

SQL Server 的 ltrim 和 rtrim 函数只会取消 char(32) 的字符, char(9) 之类的字符则不会剔除。今天在处理论坛的一个bug时,发现数据多了空格,就是char(9)在作怪。

一个演示SQL代码:

declare @s nvarchar(50)
select @s = char(32)+char(9)+'*'
print('%'+@s+'%')
select @s = ltrim(rtrim(@s))
print('%'+@s+'%')
print (str(len(@s)))

而 C# 中则没有类似问题,它剔除了很多非 char(32) 的空格。

演示代码:

static void Main(string[] args)
{
    string s = string.Format("{0}{1}*", (char)32, (char)9);
    Console.WriteLine("%" + s + "%");
    Console.WriteLine(s.Length);
    s = s.Trim();
    Console.WriteLine("%" + s + "%");
    Console.WriteLine(s.Length);
    Console.ReadLine();
}

MSDN上一些空格的资料:

下表列出了被 Trim 方法移除的空白字符。第一列列出了字符的 Unicode 名称,第二列列出了标识该字符的 Unicode 码位的十六进制表示法。
(请注意,尽管传递特定字符时静态 Char.IsWhiteSpace(Char) 方法返回了 true,但该字符不一定被 Trim 方法移除。(作者注:MSDN上这句话很让我困惑,下面2个表中,Char.IsWhiteSpace中的空格都出现在Trim 中的空格了呀?))

Unicode 名称Unicode 码位
CHARACTER TABULATIONU+0009
LINE FEEDU+000A
LINE TABULATIONU+000B
FORM FEEDU+000C
CARRIAGE RETURNU+000D
SPACEU+0020
NEXT LINEU+0085
NO-BREAK SPACEU+00A0
OGHAM SPACE MARKU+1680
EN QUADU+2000
EM QUADU+2001
EN SPACEU+2002
EM SPACEU+2003
THREE-PER-EM SPACEU+2004
FOUR-PER-EM SPACEU+2005
SIX-PER-EM SPACEU+2006
FIGURE SPACEU+2007
PUNCTUATION SPACEU+2008
THIN SPACEU+2009
HAIR SPACEU+200A
ZERO WIDTH SPACEU+200B
LINE SEPARATORU+2028
PARAGRAPH SEPARATORU+2029
IDEOGRAPHIC SPACEU+3000
ZERO WIDTH NO-BREAK SPACEU+FEFF

会被 Char.IsWhiteSpace( 认为是空白字符的包括以下Unicode 字符:

  • SpaceSeparator 类别的成员,该类别包括 SPACE 字符 (U+0020)。
  • LineSeparator 类别的成员,该类别只包括 LINE SEPARATOR 字符 (U+2028)。
  • ParagraphSeparator 类别的成员,该类别只包括 PARAGRAPH SEPARATOR 字符 (U+2029)。
  • 字符 CHARACTER TABULATION (U+0009)、LINE FEED (U+000A)、LINE TABULATION (U+000B)、FORM FEED (U+000C)、CARRIAGE RETURN (U+000D)、NEXT LINE (U+0085) 和 NO-BREAK SPACE (U+0000A0)。

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

SQL Server处理特殊空格字符时,常规的 `LTRIM()` 和 `RTRIM()` 函数只能清除普通的空格(ASCII 码为 32),对于制表符(Tab,ASCII 码为 9)、换行符(Line Feed,ASCII 码为 10)或回车符(Carriage Return,ASCII 码为 13)等特殊空格字符无效。为了有效清除这些字符,需要使用 `REPLACE()` 函数结合 `CHAR()` 函数来实现。 ### 清除特定特殊空格字符 如果已知字段中存在特定的特殊空格字符,可以通过 `REPLACE()` 函数结合 `CHAR()` 函数进行替换。例如,清除字段中的制表符: ```sql SELECT REPLACE(column_name, CHAR(9), '') AS CleanedValue FROM table_name; ``` 若字段中存在换行符或回车符,也可以分别使用 `CHAR(10)` 或 `CHAR(13)` 来清除: ```sql SELECT REPLACE(REPLACE(column_name, CHAR(10), ''), CHAR(13), '') AS CleanedValue FROM table_name; ``` ### 获取未知特殊空格的 ASCII 值 当字段中存在未知的特殊空格字符时,可以通过 `REPLACE()` 函数结合 `ASCII()` 函数获取其 ASCII 值。例如,字段 `name` 中存在一个未知空格前缀: ```sql SELECT ASCII(REPLACE(name, 'zhangsan', '')) AS SpecialSpaceASCII FROM table_name WHERE name LIKE '%zhangsan%'; ``` 通过执行上述语句,可以获取特殊空格的 ASCII 值,之后即可使用 `REPLACE()` 函数清除该字符: ```sql SELECT REPLACE(name, CHAR(特殊ASCII值), '') AS CleanedValue FROM table_name; ``` ### 处理多个特殊空格字符 如果字段中可能包含多个不同类型的特殊空格字符,可以通过嵌套多个 `REPLACE()` 函数来清除所有类型的空格。例如,清除普通空格、制表符、换行符和回车符: ```sql SELECT REPLACE(REPLACE(REPLACE(REPLACE(column_name, CHAR(32), ''), CHAR(9), ''), CHAR(10), ''), CHAR(13), '') AS CleanedValue FROM table_name; ``` 通过上述方法,可以有效地清除 SQL Server 字段中的各种特殊空格字符,确保数据的整洁性与一致性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值