SQL Server空格处理

来源:互联网 发布:手机照片移花接木软件 编辑:程序博客网 时间:2024/05/17 23:25

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+0009LINE FEEDU+000ALINE TABULATIONU+000BFORM FEEDU+000CCARRIAGE RETURNU+000DSPACEU+0020NEXT LINEU+0085NO-BREAK SPACEU+00A0OGHAM SPACE MARKU+1680EN QUADU+2000EM QUADU+2001EN SPACEU+2002EM SPACEU+2003THREE-PER-EM SPACEU+2004FOUR-PER-EM SPACEU+2005SIX-PER-EM SPACEU+2006FIGURE SPACEU+2007PUNCTUATION SPACEU+2008THIN SPACEU+2009HAIR SPACEU+200AZERO WIDTH SPACEU+200BLINE SEPARATORU+2028PARAGRAPH SEPARATORU+2029IDEOGRAPHIC SPACEU+3000ZERO 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)。