2011-11-25 17 views
5

मेरे पूर्ववर्तियों की त्रुटियों के कारण एक (MySQL) डेटाबेस मैं उपयोग करना चाहता हूं जिसमें कई HTML इकाइयां हैं (उदा। € के बजाय)।डेटाबेस से एचटीएमएल इकाइयों को हटाएं

डेटाबेस कच्चे डेटा होना चाहिए जैसा कि मैंने उन्हें डीबी से हटा दें और उचित UTF8 में संग्रहीत करना चाहते हैं (एक डेटाबेस HTML के साथ कोई लेना देना नहीं होना चाहिए), मोरचा पहले से ही है।

इसे ठीक करने का एक अच्छा तरीका क्या होगा? एकमात्र चीज जिसे मैं सोच सकता हूं वह एक PHP स्क्रिप्ट लिखना है जो सभी डेटा प्राप्त करता है, इसे html_entity_decode() के माध्यम से चलाता है और इसे वापस लिखता है। यह एक करने योग्य है क्योंकि यह एक बार का ऑपरेशन है और डीबी केवल 100 एमबी बड़ा है, लेकिन यह अभी भी इष्टतम से कम है।

कोई भी विचार?

+0

हो जाएगा यह केवल कुछ अलग वर्ण है, तो आप शायद सरल तार के साथ एक अद्यतन क्वेरी कर सकता है खोज/बदलें। लेकिन अगर यह एक विस्तृत विविधता है, तो PHP राउंड-ट्रिप विकल्प के साथ जाएं। –

+0

अकेले इस डेटाबेस में 50 से अधिक इकाइयां उपयोग में हैं, और एचटीएमएल &#xxx; सिंटैक्स का उपयोग करके प्रत्येक चरित्र को एचटीएमएल इकाई के रूप में लिखा जा सकता है, इसलिए यह खोज और प्रतिस्थापन जितना आसान नहीं है। – dtech

उत्तर

2

चूंकि कोई भी संतोषजनक SQL-only समाधान प्रदान नहीं कर सकता है, इसलिए मैंने इसे इस तरह की एक स्क्रिप्ट के साथ हल किया। ध्यान दें कि यह तभी काम करता है सभी तालिकाओं आप पर इसका इस्तेमाल एक प्राथमिक कुंजी है, लेकिन यह आम तौर पर मामला

<?php 
// Specify which columns need to be de-entitiezed 
$affected = array(
    'table1' => array('column1', 'column2'), 
    'table2' => array('column1', 'column2'), 
); 

// Make database connection 
$db = new PDO("mysql:dbname=yourdb;host=yourhost", "user", "pass"); 

foreach($affected as $table => $columns){ 
    // Start a transaction for each table 
    $db->beginTransaction(); 

    // Find the table primary key. PHP5.4 syntax! 
    $pk = $db->query("SHOW INDEX FROM " . $table . " WHERE Key_name = 'PRIMARY'")->fetch()[0]; 

    foreach($columns as $column){ 
     // Construct a prepared statement for this column 
     $ps = $db->prepare("UPDATE " . $table . " SET " . $column . " . = ? WHERE " . $pk . " = ?"); 

     // Go through all rows 
     foreach($db->query("SELECT " . $column . ", " . $pk . " FROM " . $table) as $row){ 
      $row[0] = html_entity_decode($row[0]); // Actual processing 
      $ps->execute($row); 
     } 
    } 

    // Everything went well for this table, commit 
    $db->commit(); 
} 
?> 
0

डेटाबेस के आधार पर (Oracle, MySQL, आदि) और आप इसे ऑफ़लाइन आप (सभी तालिकाओं के लिए आवेषण युक्त) एक बड़े SQL स्क्रिप्ट के रूप में सभी DDL और डेटा निर्यात करने में सक्षम हो सकता उठा सकता है। तो फिर तुम एक मानक खोज कर सकता है/sed का उपयोग कर की जगह:

sed -i 's/&euro;/€/g' script.sql 

तो डेटाबेस ड्रॉप या टेबल काटना और स्क्रिप्ट का उपयोग कर इसे पुन:।

0

आखिरकार मुझे लगता है कि आपको कुछ चरणों में PHP का सहारा लेना होगा, एसक्यूएल में इन एंटरसाइट्स को परिवर्तित करने के लिए बहुत अधिक विलक्षण तर्क का आह्वान किया जा रहा है।

http://dev.mysql.com/doc/refman/5.0/en/case-statement.html 

:

हालांकि, एक दृष्टिकोण मैं अगर आप एसक्यूएल का उपयोग करना चाहिए के बारे में सोच सकता है, एक उपयोगकर्ता परिभाषित समारोह, esentially में एक विशाल मामले बयान है कि (या/तो अगर के बहुत सारे) बनाने के लिए है तो आपको बस कुछ ऐसा करने में सक्षम होना चाहिए:

SELECT col1,col2,col3,mtuserdecodefunction(column-with-entities-in) FROM mytable 

सिद्धांत में आपको एक साफ तालिका वापस करनी चाहिए।

1

मुझे लगता है कि आपको एक MySQL प्रक्रिया बनाने की आवश्यकता है। (चयन लूप और अद्यतन प्रतिस्थापित करें)
REPLACE(TextString, '&apos;','"') ;

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