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 TABULATION | U+0009 |
| LINE FEED | U+000A |
| LINE TABULATION | U+000B |
| FORM FEED | U+000C |
| CARRIAGE RETURN | U+000D |
| SPACE | U+0020 |
| NEXT LINE | U+0085 |
| NO-BREAK SPACE | U+00A0 |
| OGHAM SPACE MARK | U+1680 |
| EN QUAD | U+2000 |
| EM QUAD | U+2001 |
| EN SPACE | U+2002 |
| EM SPACE | U+2003 |
| THREE-PER-EM SPACE | U+2004 |
| FOUR-PER-EM SPACE | U+2005 |
| SIX-PER-EM SPACE | U+2006 |
| FIGURE SPACE | U+2007 |
| PUNCTUATION SPACE | U+2008 |
| THIN SPACE | U+2009 |
| HAIR SPACE | U+200A |
| ZERO WIDTH SPACE | U+200B |
| LINE SEPARATOR | U+2028 |
| PARAGRAPH SEPARATOR | U+2029 |
| IDEOGRAPHIC SPACE | U+3000 |
| ZERO WIDTH NO-BREAK SPACE | U+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)。

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

被折叠的 条评论
为什么被折叠?



