字符串比较==,当它忽略空格时

joh*_* Gu 4 c# asp.net asp.net-mvc entity-framework

我的asp.net mvc web应用程序中有以下方法,以检查ip地址是否已经存在: -

public bool ISTMSIPUnique(string ip, int? id=0) 
{
    var technology = FindTechnology(id.Value);
    var result = tms.TechnologyIPs.Where(a.IPAddress.ToUpper() == ip.ToUpper());
    return (result.Count() == 0);
}
Run Code Online (Sandbox Code Playgroud)

但我注意到a.IPAddress.ToUpper() == ip.ToUpper()会做以下事情: -

  1. 它将假设"测试"和"测试"是相同的.(它将忽略角色末尾的空格).
  2. 但是会假设"测试"和"测试",左边和右边的空白区域是两个不同的字符串.

那么这背后的规则是什么?我应该总是修剪()字符串,然后将其保存到SQL Server DB以克服此问题,因为IP地址不能包含空格吗?

Pre*_*lot 8

由于您发布了实际使用EF 的详细信息,因此我对字符串比较的评论无效.

假设您的数据库是Sql Server,或者符合ANSI标准的任何数据库进行字符串比较,则在比较之前将字符串填充为相同的长度.所以'test'被填充为与'test'相同的长度,通过在比较字符串之前附加一个空格字符,因此它们评估为相等.相反,当比较'test'和'test'时,'test'被填充到'test',与'test'的长度相同,这仍然导致字符串不能比较为等价.

http://support.microsoft.com/kb/316626

  • +1,非常有趣!这解释了这个问题.我很惊讶我之前在代码中没有发现过这种情况. (2认同)