如何在 MySQL 中为长 VARCHAR 列实现唯一键

jw_*_*jw_ 2 mysql varchar

我需要让 MySQL 检查最大长度为 5000 且不是主键的 VARCHAR 列的唯一性。我可以在列上使用长度为 500 的索引来加快查询速度,但是如何创建一个有效的唯一键呢?

尝试插入两个记录时,长度为 500 的唯一键失败,这些记录的前 500 个字符的列相同,之后的某处有所不同。

AMt*_*two 7

无论您如何实现,直接检查 5000 个字符的字符串的唯一性都将是非常昂贵的。

我建议计算一个散列,存储该散列,并计算该散列的唯一性。这几乎是同一件事,但确实引入了散列冲突的机会,其中两个不同的值导致相同的散列。

碰撞的可能性会因散列算法而异:MD5在碰撞中的几率为2 128 分之一。SHA1 和 SHA256 各自提供更好的碰撞保护,但速度较慢/成本较高。

例如:您可以使用该MD5()函数创建一个计算/虚拟列,然后在该列上创建一个唯一索引。这不能保证完美的唯一性,但对于大多数目的来说可能足够独特,因为您有 5k 大块的文本要保持唯一性。

使用散列,如果两个不同的唯一字符串发生散列冲突,这将阻止插入第二个唯一值。但是,两个相同的字符串将产生相同的哈希值。因此,弱散列算法的问题在于,它在防止不应该被欺骗的情况下过于激进