2011-11-30 15 views
11

वर्तमान में मैं मैन्युअल रूप से एक स्ट्रिंग बना रहा हूं जहां मैं अपनी तालिका में प्रत्येक पंक्ति में सभी मानों को जोड़ता हूं। मैं पंक्ति के वर्तमान मानों (/ स्थिति) के लिए हैश मान प्राप्त करने के लिए प्रत्येक पंक्ति के लिए इस स्ट्रिंग को हैशिंग कर रहा हूं, जिसे बाद में मैं यह निर्धारित करने के लिए उपयोग कर रहा हूं कि पंक्ति बदल गई है या नहीं।mySQL: प्रत्येक पंक्ति के लिए हैश मान प्राप्त करें?

मैन्युअल रूप से ऐसा करने के बजाय, क्या कोई अंतर्निहित तरीका है कि मैं प्रत्येक पंक्ति के लिए एक अद्वितीय हैश मान प्राप्त करने के लिए?

उत्तर

17

आप की तरह

SELECT MD5(concat(field1, field2, field3, ...)) AS rowhash 

कुछ कर सकते हैं, लेकिन आप सूची आप कौन सी फ़ील्ड चाहते हैं, के रूप में concat(*) एक विकल्प (सिंटेक्स त्रुटि) नहीं है से दूर नहीं कर सकते।

1

concat_ws() का उपयोग करना बेहतर है। जैसे दो निकट स्तंभ: 12,3 => 1,23।

क्षमा करें, यह अभी भी कुछ समस्याएं हैं। शून्य मान, खाली स्ट्रिंग के बारे में सोचें, स्ट्रिंग में ',', आदि शामिल हो सकते हैं ...

हैश कथन उत्पन्न करने के लिए एक प्रोग्राम आवश्यक है, जिसे शून्य से विशिष्ट मान (शून्य-सक्षम कॉलम के लिए) को प्रतिस्थापित करना चाहिए, और कभी-कभी इस्तेमाल किए गए चार/बाइट को विभाजक के रूप में भी उपयोग करें।

2

ठीक है मैंने एक छोटी सी लिपि बनाई है जो आप चाहते हैं कि वास्तव में क्या कर सकता है, और शायद अन्य क्या चाहते हैं ... तो यहां यह PHP के लिए ... पहले आपको कॉलम की सूची बनाना है तालिका के बाद, आप अपने कॉलम के आधार पर प्रत्येक कॉलम के लिए "केस कब" कथन बनाते हैं और उसे concat_ws कथन में डालते हैं और फिर आप इसे sha1 के साथ रखते हैं ... मैंने इस विधि को बहुत बड़ी टेबल पर उपयोग किया है (600000+ रिकॉर्ड) और सभी रिकॉर्ड चुनते समय गति काफी अच्छी है। भी मुझे लगता है कि यह एक concat_ws में आवश्यक डेटा concat और php या जो भी आप उपयोग कर रहे हैं में यह विस्फोट के लिए तेजी से होता है, लेकिन यह सिर्फ एक कूबड़ है ...

<? 
$query= mysql_query("SHOW COLUMNS FROM $table", $linklive); 
     while ($col = mysql_fetch_assoc($query)) { 
      $columns[] = mysql_real_escape_string($col['Field']); 
      if ($col['Key'] == 'PRI') { 
       $key = mysql_real_escape_string($col['Field']); 
      } 
      $columnsinfo[$col['Field']] = $col; 
     } 
     $dates = array("date","datetime","time"); 
        $int = array("int","decimal"); 
        $implcols = array(); 
        foreach($columns as $col){ 
         if(in_array($columnsinfo[$col]['Type'], $dates)){ 
          $implcols[] = "(CASE WHEN (UNIX_TIMESTAMP(`$col`)=0 || `$col` IS NULL) THEN '[$col EMPTY]' ELSE `$col` END)"; 
         }else{ 
          list($type, $rest) = explode("(",$columnsinfo[$col]['Type']); 
          if(in_array($columnsinfo[$col]['Type'], $dates)){ 
           $implcols[] = "(CASE WHEN (`$col`=0 || `$col` IS NULL) THEN '[$col EMPTY]' ELSE `$col` END)"; 
          }else{ 
           $implcols[] = "(CASE WHEN (`$col`='' || `$col` IS NULL) THEN '[$col EMPTY]' ELSE `$col` END)"; 
          } 
         } 
        } 
        $keyslive = array(); 
        //echo "SELECT $key SHA1(CONCAT_WS('',".implode(",", $columns).")) as compare FROM $table"; exit; 
        $q = "SELECT $key as `key`, SHA1(CONCAT_WS('',".implode(", ",$implcols).")) as compare FROM $table"; 
    ?> 
+8

कि पागल लग रहा है –

संबंधित मुद्दे