2011-08-20 70 views
4

我很努力地在MySQL中創建一個觸發器,這樣每次我將一個值插入名爲title的列中時,都應該創建一個HASH並將其存儲在列title_hash中。因爲我不知道這是如何工作,我發現這個代碼,而谷歌搜索:如何告訴MySQL在Update/Insert之前觸發一個Hash?

CREATE TRIGGER insertModelHash 
BEFORE 
    INSERT 
ON 
    products 
FOR EACH ROW SET 
    NEW.model_hash = CONV(RIGHT(MD5(NEW.products_model), 16), 16, 10) 

MySQL的基準告訴我,這意味着:

  1. 創建一個名爲insertModelHash觸發...
  2. ...在插入行int表之前products ...
  3. 在我打算插入的每一個新行中,對列products_model使用函數MD5, RIGHT, CONV

的3點需要更多的解釋:

  • 我猜,這NEW是某種新行標識符。因此NEW.products_model指向當前(新)行中的列products_model
  • Then MD5 is issued。由於我想使用SHA-2,因此我很明顯要更改MD5(NEW.products_model), 16) ===>SHA2(NEW.products_model), 224)
  • 現在我奮鬥了:爲什麼這個傢伙使用CONV(RIGHT(...)...)?這真的有必要嗎?

其他信息:現在,我做

hashlib.sha224(title).hexdigest() 
在Python

並存儲該值。

我很感激任何建議/解釋!

回答

5

要回答你的三個問題:

NEW關鍵字引用的「僞表」的,將被插入的記錄。在更新的觸發器上,您可以訪問'新'和'舊',並在刪除時只訪問'舊'。

是的,MD5用於創建散列。但是,在你的問題中,你有一部分參數包含在'RIGHT'功能中。這只是MD5(NEW.products_model)(沒有, 16)。是的,你可以替代SHA2爲MD5,如果可用(如果MySQL配置SSL支持)後才能使用它。

RIGHT(string, number)簡單,需要正確的「數字」的字符從'字符串' CONV()函數用於轉換基數之間的數字,後兩個函數的組合使用散列的右側16個字符,並將它們從基數16(十六進制)轉換爲基數10(十進制)。

答案是否定的,你不需要他們,如果你想要做的是存儲哈希本身。

NEW.model_hash = SHA2(NEW.products_model) 
+0

可以肯定的是:如果我在'NEW.title'上調用'SHA2',我會得到與我在Python中使用'hashlib.sha224(title).hexdigest()'相同的結果嗎? – Aufwind

+0

這裏的第幾段http://dev.mysql.com/doc/refman/5.5/en/encryption-functions.html說說返回值。簡短的答案是合格的。需要注意的是,根據您使用的mysql版本,返回值可能是二進制字符串或字符串。無論哪種方式,我不認爲除了將其存儲在varchar字段中之外,您還需要做其他事情,並且它將被轉換,但是我會對兩個源之間的已知值進行測試,以確保它們可用。 –

+0

謝謝@Doug! – Aufwind

相關問題