我的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()
会执行以下操作: -
那背后的规则是什么?我应该总是修剪()字符串,然后将其保存到SQL Server DB以解决此问题,因为IP地址不能包含空格吗?
答案 0 :(得分:8)
由于您使用EF发布了实际的详细信息,因此我对字符串比较的评论无效。
假设您的数据库是Sql Server,或者符合ANSI标准的任何数据库进行字符串比较,则在比较之前将字符串填充为相同的长度。所以'test'被填充为与'test'相同的长度,通过在比较字符串之前附加一个空格字符,因此它们评估为相等。相反,当比较'test'和'test'时,'test'被填充到'test',与'test'的长度相同,这仍然会导致字符串不能比较等效。
答案 1 :(得分:1)
绝对“测试”和“测试”是不同的字符串。框架永远不会忽略空格。
我会将修剪过的字符串保存到数据库中。另外我建议使用 string.Equals 进行字符串比较。
顺便说一句,如果您正在使用IP地址,为什么需要调用ToUpper方法?
我建议阅读这篇文章。它是关于字符串实习池。 http://msdn.microsoft.com/en-us/library/system.string.intern.aspx。很有用!
公共语言运行库通过维护一个名为intern pool的表来保存字符串存储,该表包含对程序中以编程方式声明或创建的每个唯一文字字符串的单个引用。因此,具有特定值的文字字符串实例仅在系统中存在一次。 例如,如果将相同的文字字符串分配给多个变量,则运行时将从实习池中检索对文字字符串的相同引用,并将其分配给每个变量。
答案 2 :(得分:-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);