Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何告诉MySQL在更新/插入之前触发哈希?_Python_Mysql_Hash_Triggers_Insert - Fatal编程技术网

Python 如何告诉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

我正在努力在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)
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字段中之外,您不需要做太多其他事情,它将被转换,但我将在两个源之间的已知值上运行测试以确保。