4

我在我的 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);
}

但我注意到a.IPAddress.ToUpper() == ip.ToUpper()将执行以下操作:-

  1. 它将假设“test”和“test”是相同的。(它将忽略字符末尾的空格)。
  2. 但是会假设“test”和“test”,左边和右边的空格是两个不同的字符串。

那么这背后的规律是什么?在将字符串保存到 SQL 服务器数据库之前,我是否应该总是修剪()字符串以克服这个问题,因为 IP 地址不能包含空格?

4

3 回答 3

9

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

假设您的数据库是 Sql Server,或任何符合 ANSI 字符串比较标准的数据库,则字符串在比较之前会被填充为相同的长度。因此,在比较字符串之前,通过附加一个空格字符将“test”填充为与“test”相同的长度,因此它们的计算结果相等。相反,当比较 'test' 和 'test' 时,'test' 被填充到 'test' 以与 'test' 长度相同,这仍然会导致字符串比较不相等。

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

于 2013-10-24T22:22:29.497 回答
1

绝对“测试”和“测试”是不同的字符串。框架从不忽略空格。

我会将修剪后的字符串保存到数据库中。另外我建议使用string.Equals进行字符串比较。

顺便说一句,如果您正在使用 IP 地址,为什么需要调用 ToUpper 方法?

我建议阅读这篇文章。它是关于字符串实习生池的。http://msdn.microsoft.com/en-us/library/system.string.intern.aspx。很有用!

公共语言运行时通过维护一个称为实习池的表来保存字符串存储,该表包含对程序中以编程方式声明或创建的每个唯一文字字符串的单个引用。因此,具有特定值的文字字符串的实例在系统中只存在一次。例如,如果您将相同的文字字符串分配给多个变量,则运行时会从实习池中检索对文字字符串的相同引用并将其分配给每个变量。

于 2013-10-24T22:04:05.677 回答
-1

'test' 和 'test' 肯定是不同的字符串

对于您的情况,我认为您需要在保存到数据库时清理 ip 地址,这样您就不需要每次都清理 ips。

另外,我认为使用 String.Equals 与字符串进行比较也是一个好习惯(您可以在那里进行更多控制,例如是否忽略大小写...),如果您想清除空格或其他一些字符,请清理在传递给函数之前。

string cleaned1 = clean your input
string cleaned2 = clean your input

bool stringEquals = String.Equals(
    cleaned1, 
    cleaned2, 
    StringComparison.OrdinalIgnoreCase);
于 2013-10-24T22:05:38.350 回答