我是 ASP.NET Core 的初学者。
我有一个表,在某些情况下没有键列,它的三列是名字、姓氏和父亲的名字。是否有算法或查询可以防止在数据库中插入重复记录?列值采用阿拉伯语言。
很难识别我的组合键等于数据库列,并且经常因为输入单个字符而被错误。
你有比较阿拉伯名字的解决方案吗?这样如果他们的书写类型不同,比较算法就会识别出来?
例如 ??? 是同一个 ??? ,但是 == 不认识这个
感谢您的帮助
你有比较阿拉伯名字的解决方案吗?这样如果他们的书写类型不同,比较算法就会识别出来?
我有一个表,在某些情况下没有键列 条件,其中三列是名字、姓氏和 父亲的名字。是否有算法或查询可以阻止插入 数据库中有重复记录?
嗯,没有现成的解决方案可用。您应该将整个重复检查步骤分成较小的块,以获得预期的结果。
首先,您可以使用 NormalizationForm 来检查 unicode 规范化形式,这表明 Unicode 字符串是使用完整规范分解进行规范化的。
在下一阶段,您应该使用 Regex 消除 unicode 变音符号来相应地比较您的值。
最后,您应该使用 StringComparison.OrdinalIgnoreCase 检查您的名字的相等性。
让我们看看实践中如何实现:
用于标准化阿拉伯名称、删除变音符号的静态类:
public static class ArabicNameComparer
{
public static bool AreEqual(string name1, string name2)
{
name1 = NormalizeArabicName(name1);
name2 = NormalizeArabicName(name2);
return string.Equals(name1, name2, StringComparison.OrdinalIgnoreCase);
}
private static string NormalizeArabicName(string name)
{
name = RemoveDiacritics(name);
name = NormalizeHamza(name);
name = name.Normalize(NormalizationForm.FormC);
return name;
}
private static string RemoveDiacritics(string text)
{
string normalized = text.Normalize(NormalizationForm.FormD);
Regex regex = new Regex(@"\p{Mn}", RegexOptions.Compiled);
return regex.Replace(normalized, string.Empty);
}
private static string NormalizeHamza(string text)
{
return text.Replace('أ', 'ا').Replace('إ', 'ا').Replace('آ', 'ا').Replace('ى', 'ي');
}
}
测试用例:
为了检查名称是否重复或注释,我正在考虑两个阿拉伯字符,它们是
"محمد"
和 "مَحْمُد"
让我们检查一下它们是否被视为重复:
string name1 = "محمد";
string name2 = "مَحْمُد";
bool equal = ArabicNameComparer.AreEqual(name1, name2);
输出:
注意: 正如您所看到的,从两个给定的阿拉伯字符我们可以检查它们是否重复。按照同样的方式,您应该根据您的要求实施。请记住,这只是我们可以做到这一点的一种方法,而不是您的场景的精确解决方案。您可以按照这种方法继续进行。此外,对于任何类型的自定义实现,请研究此官方文档。