Python 如何告诉MySQL在更新/插入之前触发哈希?
我正在努力在MySQL中创建一个触发器,这样每当我在名为Python 如何告诉MySQL在更新/插入之前触发哈希?,python,mysql,hash,triggers,insert,Python,Mysql,Hash,Triggers,Insert,我正在努力在MySQL中创建一个触发器,这样每当我在名为title的列中插入一个值时,就会创建一个散列,并将其存储在title\u散列中。由于我不知道这是如何工作的,我在谷歌搜索时发现了以下代码: CREATE TRIGGER insertModelHash BEFORE INSERT ON products FOR EACH ROW SET NEW.model_hash = CONV(RIGHT(MD5(NEW.products_model), 16), 16, 10) MySQ
title
的列中插入一个值时,就会创建一个散列,并将其存储在title\u散列中。由于我不知道这是如何工作的,我在谷歌搜索时发现了以下代码:
CREATE TRIGGER insertModelHash
BEFORE
INSERT
ON
products
FOR EACH ROW SET
NEW.model_hash = CONV(RIGHT(MD5(NEW.products_model), 16), 16, 10)
MySQL引用告诉我,这意味着:
创建一个名为insertModelHash
的触发器
。。。在插入行int table产品之前
在我要插入的每一行中使用products\u model
列上的函数MD5,RIGHT,CONV
三。这一点需要更多的解释:
- 我猜,
NEW
是新行的某种标识符。因此NEW.products\u model
指向当前(新)行中的products\u model
列
- 然后发出
MD5
。因为我想使用SHA-2,所以很明显我需要更改MD5(新的.products\u模型),16)
==>SHA2(新的.products\u模型),224)
- 现在我在挣扎:为什么这家伙要使用
CONV(右(…)…)
?这真的有必要吗?
附加信息:现在,我正在做
hashlib.sha224(title).hexdigest()
并存储该值
非常感谢您的建议/解释 要回答您的三个问题:
NEW
关键字引用要插入的记录的“伪表”。在更新的触发器上,您可以访问“NEW”和“OLD”,在删除时,您可以访问“OLD”
是的,MD5用于创建哈希。但是,在您的问题中,包含了“RIGHT”函数的部分参数。它只有MD5(新的.products\u型号)
(没有,16)
。是的,如果MD5可用,您可以用SHA2代替它(只有在MySQL配置为SSL支持时才可用)
RIGHT(string,number)
只是从“string”中提取正确的“number”字符。
CONV()函数用于在基数之间转换数字。最后两个函数的组合采用散列的右16个字符,并将它们从基数16(十六进制)转换为基数10(十进制)
答案是不,如果您只想存储散列本身,就不需要它们
NEW.model_hash = SHA2(NEW.products_model)
可以肯定的是:如果我在NEW.title
上调用SHA2
,我将得到与在Python中调用hashlib.sha224(title.hexdigest()
时相同的结果?这里的前两段讨论返回值。简短的回答是有保留的“是”。需要注意的是,根据您使用的mysql版本,返回值可能是二进制字符串或字符串。不管是哪种方式,我真的认为除了将其存储在varchar字段中之外,您不需要做太多其他事情,它将被转换,但我将在两个源之间的已知值上运行测试以确保。