Mysql

如何在 MySQL 中為長 VARCHAR 列實現唯一鍵

  • October 27, 2019

我需要讓 MySQL 檢查最大長度為 5000 且不是主鍵的 VARCHAR 列的唯一性。我可以在列上使用長度為 500 的索引來加快查詢速度,但是如何創建有效的唯一鍵?

嘗試插入兩條記錄時,長度為 500 的唯一鍵失敗,其前 500 個字元的列相同,之後的某處不同。

直接檢查 5000 個字元的字元串的唯一性將非常昂貴,無論您如何實現它。

我建議計算一個散列,儲存該散列,併計算該散列的唯一性。這幾乎是同一件事,但確實引入了散列衝突的機會,其中兩個不同的值導致相同的散列。

衝突的可能性將隨散列算法而變化:MD5 有 2 128分之一的機會發生衝突。SHA1 和 SHA256 各自提供更好的碰撞保護,但速度較慢/成本更高。

例如:您可以使用該MD5()函式創建一個計算/虛擬列,然後在該列上創建一個唯一索引。這不能保證完美的唯一性,但對於大多數需要保持唯一性的 5k 文本塊的用途來說,這可能已經足夠獨特了。

使用散列,如果兩個不同的唯一字元串發生散列衝突,這將阻止插入第二個唯一值。但是,兩個相同的字元串將產生相同的雜湊。因此,弱散列算法的問題在於,它會在不應該的情況下過於激進地防止欺騙。

引用自:https://dba.stackexchange.com/questions/252009