MySQL क्वेरी का उपयोग करके संपूर्ण तालिका में टेक्स्ट ढूंढें और बदलें


235

आमतौर पर मैं phpmyadmin का उपयोग करके एक MySQL डेटाबेस में पाठ को बदलने के लिए मैन्युअल खोज का उपयोग करता हूं। मैं अब इससे थक गया हूं, मैं phpmyadmin में संपूर्ण तालिका में नए पाठ के साथ पाठ को खोजने और बदलने के लिए एक क्वेरी कैसे चला सकता हूं?

उदाहरण: कीवर्ड खोजें domain.com, साथ बदलें www.domain.com


के संभावित डुप्लिकेट stackoverflow.com/questions/639531/...
sel

1
आप कुछ काम कर सकते हैं जैसे [यह] [१]। [१]: stackoverflow.com/questions/562457/…
प्रमोद

2
इससे आपको वह हासिल करने में मदद मिलेगी जो आपको चाहिए।
डोम

जवाबों:


551

एक single tableअद्यतन के लिए

 UPDATE `table_name`
 SET `field_name` = replace(same_field_name, 'unwanted_text', 'wanted_text')

से multiple tables-

आप सभी तालिकाओं से संपादित करना चाहते हैं, सबसे अच्छा तरीका लेने के लिए है dumpऔर फिर find/replaceऔर इसे वापस अपलोड करें।


4
क्या यह पूरे क्षेत्र को प्रतिस्थापित करता है, या इसके साथ एक क्षेत्र के भीतर एक प्रतिस्थापन मैच करता है?
रैंडी ग्रीनकोर्न

3
यह @RandyGreencorn क्षेत्र के भीतर एक प्रतिस्थापन की जगह लेगा। यह केस-संवेदी भी है।
एंड्रयू

10
और यह 'www.domain.com' और 'www.domain.com' के साथ 'domain.com' को '
www.www.domain.com

2
इस पर अधिक: If you want to edit from all tables, best way is to take the dump and then find/replace and upload it back.खोजने / बदलने के लिए डंप पर sed का उपयोग करें:sed "s:unwanted_text:wanted_text:g" dump.sql
kakoma

2
बहुत अच्छा काम करता है। जैसा कि दूसरों ने कहा है, कभी-कभी मुझे phpMyAdmin में काम करने के लिए उद्धरण के साथ गड़बड़ करना पड़ता है। मैंने इसका उपयोग केवल "http:" पाठ को "https:" के साथ पूर्ण वेब पते वाले कॉलम में बदलने के लिए किया था। बाकी वेब पते अछूते नहीं थे।
Heres2u

40

सबसे आसान तरीका मैंने पाया है कि डेटाबेस को टेक्स्ट फाइल में डंप करना, रिप्लेस करने के लिए एक sed कमांड चलाना और डेटाबेस को MySQL में वापस लोड करना।

नीचे सभी कमांड लिनक्स पर बैश हैं।

डेटाबेस को पाठ फ़ाइल में डंप करें

mysqldump -u user -p databasename > ./db.sql

लक्ष्य स्ट्रिंग खोजने / बदलने के लिए sed कमांड चलाएँ

sed -i 's/oldString/newString/g' ./db.sql

MySQL में डेटाबेस को फिर से लोड करें

mysql -u user -p databasename < ./db.sql

बहुत आसान।


2
यह आश्चर्यजनक तेजी से काम करता है। मुझे यह समाधान पसंद है। मुझे कुछ url रिप्लेसमेंट करने थे और स्लैश का उपयोग करने के बजाय मेरे सीमांकक के रूप में मैंने इसके बजाय पाइप का उपयोग किया (इसे पढ़ें grymoire.com/Unix/Sed.html )। उदाहरण: sed -i 's | olddomain.com | http: //newdomain.com | g './db.sql
माइक

1
यह इतना तेज़ था कि मुझे लगा कि यह काम नहीं करेगा। लेकिन यह किया! इसके अलावा, आप बस इस तरह से स्लैश से बच सकते हैं:\/\/domain.com
m.cichacz

2
बस एक चेतावनी है कि ओएस एक्स में, sed -iकमांड unterminated substitute patternत्रुटि को बाहर कर सकता है । आप sed -i '' -e 's/oldString/newString/g' ./db.sqlइसके बजाय उपयोग कर सकते हैं ।
बाद में

25

इसे php फ़ाइल में रखें और इसे चलाएं और इसे वही करना चाहिए जो आप इसे करना चाहते हैं।

// Connect to your MySQL database.
$hostname = "localhost";
$username = "db_username";
$password = "db_password";
$database = "db_name";

mysql_connect($hostname, $username, $password);

// The find and replace strings.
$find = "find_this_text";
$replace = "replace_with_this_text";

$loop = mysql_query("
    SELECT
        concat('UPDATE ',table_schema,'.',table_name, ' SET ',column_name, '=replace(',column_name,', ''{$find}'', ''{$replace}'');') AS s
    FROM
        information_schema.columns
    WHERE
        table_schema = '{$database}'")
or die ('Cant loop through dbfields: ' . mysql_error());

while ($query = mysql_fetch_assoc($loop))
{
        mysql_query($query['s']);
}

मेरे लिए काम नहीं किया, अच्छा सुझाव हालांकि - मीठा होता
AlexHighHigh

23

सभी वर्डप्रेस ब्लॉग पोस्टों में टेक्स्ट को खोजने और बदलने के लिए PHPmyadmin में एक SQL क्वेरी चलाना, जैसे कि mysite.com/wordpress को खोजना और इस उदाहरण में mysite.com/news टेबल के साथ tj_posts है

UPDATE `tj_posts`
SET `post_content` = replace(post_content, 'mysite.com/wordpress', 'mysite.com/news')

2
क्वेरी के लिए धन्यवाद। मेरे वर्डप्रेस साइट के लिए कॉलम का नाम wp_postsइतना है कि क्वेरी दिखता हैUPDATE `wp_posts` SET `post_content` = replace(post_content, 'mysite.com/wordpress', 'mysite.com/news')
मैरिस बी।

10

एक अन्य विकल्प डेटाबेस में प्रत्येक कॉलम के लिए स्टेटमेंट जेनरेट करना है:

SELECT CONCAT(
    'update ', table_name , 
    ' set ', column_name, ' = replace(', column_name,', ''www.oldDomain.com'', ''www.newDomain.com'');'
) AS statement
FROM information_schema.columns
WHERE table_schema = 'mySchema' AND table_name LIKE 'yourPrefix_%';

इसके बाद अपडेट स्टेटमेंट की एक सूची तैयार करनी चाहिए जिसे आप तब निष्पादित कर सकते हैं।


2
डंपिंग की तुलना में धीमी, लेकिन उन लोगों के लिए जो कमांड लाइन के साथ सहज महसूस नहीं करते हैं, यह उत्तर रचनात्मक और प्रभावी है।
स्टीफन

3
यह अब तक का सबसे अच्छा तरीका है, यदि आपके पास बहुत अधिक डेटा है और इसे डंप / रीलोड नहीं कर सकते हैं।
कारीम

अरे यार ये बढ़िया काम किया! मैं इस विचार के आधार पर अपनी स्क्रिप्ट साझा करूंगा
एंडी

यह एक अंडरेटेड समाधान है। पूरी तरह से मेरे लिए काम किया।
rw-intechra

8
 UPDATE table SET field = replace(field, text_needs_to_be_replaced, text_required);

उदाहरण के लिए, अगर मैं मार्क द्वारा जॉन की सभी घटनाओं को बदलना चाहता हूं, तो मैं नीचे उपयोग करूंगा,

UPDATE student SET student_name = replace(student_name, 'John', 'Mark');

3

phpMyAdmin में एक साफ-सुथरा और बदला हुआ टूल शामिल है।

तालिका का चयन करें, फिर खोज > हिट करें खोजें और प्रतिस्थापित करें

इस क्वेरी में लगभग एक मिनट का समय लगा और सफलतापूर्वक कॉलम के oldurl.extसाथ कई हजार उदाहरणों को बदल दिया गयाnewurl.extpost_content

phpMyAdmin में ढूँढें-और-बदलें सुविधा का स्क्रीनशॉट

इस विधि के बारे में सबसे अच्छी बात: आपको हर मैच को कमिट करने से पहले देखना होगा।

NB मैं phpMyAdmin 4.9.0.1 का उपयोग कर रहा हूं


2

मेरा मानना ​​है कि "स्वप्नेश" का उत्तर सबसे अच्छा है! दुर्भाग्य से मैं इसे phpMyAdmin (4.5.0.2) में क्रियान्वित नहीं कर सका, हालांकि अतार्किक (और कई चीजों की कोशिश) यह कहता रहा कि एक नया बयान मिला है और कोई परिसीमन नहीं मिला है ...

इस प्रकार मैं निम्नलिखित समाधान के साथ आया था जो उपयोगी हो सकता है यदि आप एक ही मुद्दे को समाप्त करते हैं और पीएमए के डेटाबेस तक कोई अन्य पहुंच नहीं है ...

UPDATE `wp_posts` AS `toUpdate`,
(SELECT `ID`,REPLACE(`guid`,'http://old.tld','http://new.tld') AS `guid` 
 FROM `wp_posts` WHERE `guid` LIKE 'http://old.tld%') AS `updated`
SET `toUpdate`.`guid`=`updated`.`guid`
WHERE `toUpdate`.`ID`=`updated`.`ID`;

अपेक्षित परिणाम का परीक्षण करने के लिए, जिसका आप उपयोग करना चाहते हैं:

SELECT `toUpdate`.`guid` AS `old guid`,`updated`.`guid` AS `new guid`
FROM `wp_posts` AS `toUpdate`,
(SELECT `ID`,REPLACE(`guid`,'http://old.tld','http://new.tld') AS `guid`
 FROM `wp_posts` WHERE `guid` LIKE 'http://old.tld%') AS `updated`
WHERE `toUpdate`.`ID`=`updated`.`ID`;

2

यदि आप सकारात्मक हैं कि अद्यतन किए जाने वाले क्षेत्रों में से कोई भी क्रमबद्ध नहीं है, तो ऊपर दिए गए समाधान अच्छी तरह से काम करेंगे।

हालाँकि, अगर किसी भी फ़ील्ड को अपडेट करने की आवश्यकता होती है, जिसमें क्रमबद्ध डेटा, SQL क्वेरी या एक साधारण खोज / डंप फ़ाइल पर प्रतिस्थापित होता है, तो क्रमबद्धता को तोड़ देगा (जब तक कि प्रतिस्थापित स्ट्रिंग में समान स्ट्रिंग के समान वर्ण नहीं होंगे)।

निश्चित रूप से, एक "क्रमबद्ध" फ़ील्ड इस तरह दिखता है:

a:1:{s:13:"administrator";b:1;}  

प्रासंगिक डेटा में वर्णों की संख्या डेटा के भाग के रूप में एन्कोडेड है।
सीरियलाइज़ेशन "ऑब्जेक्ट्स" को एक डेटाबेस में आसानी से संग्रहीत प्रारूप में, या विभिन्न भाषाओं के बीच ऑब्जेक्ट डेटा को आसानी से परिवहन करने का एक तरीका है।
यहां ऑब्जेक्ट डेटा को क्रमबद्ध करने के लिए उपयोग किए जाने वाले विभिन्न तरीकों की व्याख्या है , और आप ऐसा क्यों करना चाहते हैं, और यहां एक वर्डप्रेस-केंद्रित पोस्ट है: सीरियल डेटा, व्हाट दैट व्हाट मी मीन एंड व्हाईट इट सो मच महत्वपूर्ण? सादे भाषा में।

यह आश्चर्यजनक होगा यदि MySQL ने कुछ उपकरण को स्वचालित रूप से क्रमबद्ध डेटा को संभालने के लिए बनाया था, लेकिन यह नहीं है, और चूंकि अलग-अलग क्रमांकन प्रारूप हैं, इसलिए ऐसा करने के लिए भी इसका कोई मतलब नहीं होगा।

wp-cli
ऊपर दिए गए कुछ उत्तर WordPress डेटाबेस के लिए विशिष्ट लग रहे थे, जो इसके अधिकांश डेटा को क्रमबद्ध करता है। वर्डप्रेस एक कमांड लाइन टूल प्रदान करता है, wp सर्च-रिप्लेसमेंट , जो क्रमबद्धता को हैंडल करता है।
एक मूल आदेश होगा:

    wp search-replace 'an-old-string' 'a-new-string' --dry-run

हालांकि, वर्डप्रेस इस बात पर जोर देता है कि guidइसे कभी नहीं बदलना चाहिए , इसलिए यह उस कॉलम को स्किप करने की सिफारिश करता है।
यह यह भी सुझाव देता है कि अक्सर आप wp_usersतालिका को छोड़ना चाहेंगे ।
यहाँ है कि क्या दिखेगा:

wp search-replace 'https://old-domain.com' 'https://shiney-new-domain.com' --skip-columns=guid --skip-tables=wp_users --dry-run

नोट: मैंने --dry-runझंडा जोड़ा है इसलिए कॉपी-पेस्ट स्वचालित रूप से किसी के डेटाबेस को बर्बाद नहीं करेगा। यह सुनिश्चित करने के बाद कि स्क्रिप्ट आपको क्या चाहिए, उसे उस झंडे के बिना फिर से चलाएं।

प्लगइन्स
यदि आप वर्डप्रेस का उपयोग कर रहे हैं, तो कई मुफ्त और व्यावसायिक प्लगइन्स भी उपलब्ध हैं जो एक gui इंटरफ़ेस की पेशकश करते हैं, जो कई अतिरिक्त सुविधाओं के साथ पैक किया गया है।

इंटरकनेक्ट / यह php लिपि
इंटरकनेक्ट / यह क्रमबद्ध डेटा को संभालने के लिए एक php स्क्रिप्ट प्रदान करता है: सुरक्षित खोज और बदलें उपकरण। यह वर्डप्रेस साइटों पर उपयोग के लिए बनाया गया था, लेकिन ऐसा लगता है कि इसका उपयोग PHP द्वारा क्रमबद्ध किसी भी डेटाबेस पर किया जा सकता है।
वर्डप्रेस सहित कई कंपनियां इस टूल की सिफारिश करती हैं। यहां निर्देश , पृष्ठ के बारे में 3/4।


1

सबसे अच्छा आप इसे sql फ़ाइल के रूप में निर्यात करते हैं और इसे दृश्य स्टूडियो कोड जैसे संपादक के साथ खोलते हैं और पाते हैं और अपने शब्दों को दोहराते हैं। मैं 16 शब्दों के लिए 1 मिनट में 1 गिग फ़ाइल sql में बदल देता हूं जो कुल 14600 शब्द है। इसका सबसे अच्छा तरीका है। और इसे बचाने के बाद इसे फिर से आयात और आयात करें। आयात के लिए इसे ज़िप के साथ संपीड़ित करना न भूलें।


0

SQL क्वेरी (FAST) बदलें

mysql -e "SELECT CONCAT ('अपडेट', table_name, 'set', column_name, '= replace (', column_name, ',' 'www.oldsite.com' ',' 'www.newsite.com.com'); ') AS कथन से जानकारी के लिए _schema.columns जहां टेबल_नाम' wp_% 'की तरह है, "-u रूट -p your_db_name_here> upgrade_script.sql

फ़ाइल की शुरुआत में कोई भी कचरा निकालें। मेरे पास थोड़े थे।

नैनो अपग्रेड_सस्क्रिप्ट। एसक्यूएल

त्रुटियों को छोड़ने के लिए --force विकल्पों के साथ उत्पन्न स्क्रिप्ट चलाएँ। (धीमी - एक कॉफी हड़पने अगर बड़ा DB)

mysql -u root -p your_db_name_here --force <upgrade_script.sql


0

अपरकेस - लोअरकेस अक्षरों के साथ वाक्यों के मामले में, हम BINARY REPACE का उपयोग कर सकते हैं

UPDATE `table_1`  SET  `field_1` =  BINARY REPLACE(`field_1`, 'find_string', 'replace_string')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.