jw_ Asked: 2019-10-27 20:43:38 +0800 CST2019-10-27 20:43:38 +0800 CST 2019-10-27 20:43:38 +0800 CST 如何在 MySQL 中为长 VARCHAR 列实现唯一键 772 我需要让 MySQL 检查最大长度为 5000 且不是主键的 VARCHAR 列的唯一性。我可以在列上使用长度为 500 的索引来加快查询速度,但是如何创建有效的唯一键? 尝试插入两条记录时,长度为 500 的唯一键失败,其前 500 个字符的列相同,之后的某处不同。 mysql varchar 1 个回答 Voted Best Answer AMtwo 2019-10-28T04:29:32+08:002019-10-28T04:29:32+08:00 直接检查 5000 个字符的字符串的唯一性将非常昂贵,无论您如何实现它。 我建议计算一个散列,存储该散列,并计算该散列的唯一性。这几乎是同一件事,但确实引入了散列冲突的机会,其中两个不同的值导致相同的散列。 冲突的可能性将随散列算法而变化:MD5 有 2 128分之一的机会发生冲突。SHA1 和 SHA256 各自提供更好的碰撞保护,但速度较慢/成本更高。 例如:您可以使用该MD5()函数创建一个计算/虚拟列,然后在该列上创建一个唯一索引。这不能保证完美的唯一性,但对于大多数需要保持唯一性的 5k 文本块的用途来说,这可能已经足够独特了。 使用散列,如果两个不同的唯一字符串发生散列冲突,这将阻止插入第二个唯一值。但是,两个相同的字符串将产生相同的哈希。因此,弱散列算法的问题在于,它会在不应该的情况下过于激进地防止欺骗。
直接检查 5000 个字符的字符串的唯一性将非常昂贵,无论您如何实现它。
我建议计算一个散列,存储该散列,并计算该散列的唯一性。这几乎是同一件事,但确实引入了散列冲突的机会,其中两个不同的值导致相同的散列。
冲突的可能性将随散列算法而变化:MD5 有 2 128分之一的机会发生冲突。SHA1 和 SHA256 各自提供更好的碰撞保护,但速度较慢/成本更高。
例如:您可以使用该
MD5()
函数创建一个计算/虚拟列,然后在该列上创建一个唯一索引。这不能保证完美的唯一性,但对于大多数需要保持唯一性的 5k 文本块的用途来说,这可能已经足够独特了。使用散列,如果两个不同的唯一字符串发生散列冲突,这将阻止插入第二个唯一值。但是,两个相同的字符串将产生相同的哈希。因此,弱散列算法的问题在于,它会在不应该的情况下过于激进地防止欺骗。