একটি মাইএসকিউএল কোয়েরি ব্যবহার করে পুরো টেবিলটিতে পাঠ্যটি সন্ধান করুন এবং প্রতিস্থাপন করুন


235

সাধারণত আমি পিএইচপিএমইডমিন ব্যবহার করে মাইএসকিউএল ডাটাবেসে পাঠ্য প্রতিস্থাপনের জন্য ম্যানুয়াল ফাইন্ড ব্যবহার করি। আমি এখন এতে ক্লান্ত হয়ে পড়েছি, phpmyadmin- এ পুরো টেবিলটিতে নতুন পাঠ্য সহ একটি পাঠ্য সন্ধান এবং প্রতিস্থাপনের জন্য কীভাবে আমি একটি ক্যোয়ারী চালাতে পারি?

উদাহরণ: কীওয়ার্ডটি সন্ধান করুন domain.com, এর সাথে প্রতিস্থাপন করুন www.domain.com


সম্ভাব্য সদৃশ stackoverflow.com/questions/639531/...
SEL

1
আপনি [এটি] [1] এর মতো কিছু করতে পারেন। [১]: স্ট্যাকওভারফ্লো.com
প্রমোদ

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
এটি @ র্যান্ডিগ্রিনকর্ন ক্ষেত্রের মধ্যে একটি সাবস্ট্রিং প্রতিস্থাপন করবে। এটি কেস-সংবেদনশীলও।
অ্যান্ড্রু

10
এবং এটি '
ডোমেন ডটকম

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 "s:unwanted_text:wanted_text:g" dump.sql
সেড

2
দুর্দান্ত কাজ করে। অন্যরা যেমন বলেছে, মাঝে মাঝে আমাকে পিএইচপিএমআইএডমিনে কাজ করার জন্য কোটগুলির সাথে গোলযোগ করতে হয়। আমি এটি পুরো ওয়েব ঠিকানা সম্বলিত একটি কলামে "https:" দিয়ে "HTTP:" পাঠ্যটি প্রতিস্থাপন করতে ব্যবহার করেছি। বাকি ওয়েব ঠিকানাগুলি অচ্ছুত ছিল।
Heres2u

40

আমি খুঁজে পাওয়া সবচেয়ে সহজ উপায় হ'ল ডাটাবেসটিকে একটি পাঠ্য ফাইলে ডাম্প করা, প্রতিস্থাপনটি করার জন্য একটি সিড কমান্ড চালানো এবং ডেটাবেসকে মাইএসকিউএলে পুনরায় লোড করা।

নীচের সমস্ত কমান্ড লিনাক্সে বাশ।

পাঠ্য ফাইলে ডাটাবেস ফেলে দিন

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

টার্গেটের স্ট্রিং সন্ধান / প্রতিস্থাপনের জন্য সেড কমান্ডটি চালান

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

মাইএসকিউএলে ডাটাবেসটি পুনরায় লোড করুন

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

সহজ কিছু.


2
এটি আশ্চর্যজনকভাবে দ্রুত কাজ করে। আমি এই সমাধান ভালোবাসি। আমাকে কিছু ইউআরএল প্রতিস্থাপন করতে হয়েছিল এবং আমার ডেলিমিটার হিসাবে স্ল্যাশ ব্যবহার করার পরিবর্তে আমি পাইপ ব্যবহার করেছি (এটি গ্রিওমায়ার / ইউনিক্স / সেডHtml পড়ুন )। উদাহরণ: সেড-আই এর | 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

এটি একটি পিএইচপি ফাইলে রাখুন এবং এটি চালান এবং এটি আপনি এটি করতে চান তা করা উচিত।

// 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']);
}

আমার পক্ষে কাজ করেননি, যদিও ভাল পরামর্শ - যদিও এটি মিষ্টি হত
আলেক্সহাই হাই হাই

23

সমস্ত ওয়ার্ডপ্রেস ব্লগ পোস্টে টেক্সট সন্ধান এবং প্রতিস্থাপনের জন্য পিএইচপিএমমিডমিনে একটি এসকিউএল কোয়েরি চালানো যেমন মাইসাইট / ওয়ার্ডপ্রেস সন্ধান করা এবং মাইসাইট / নিউজ টেবিলের সাথে প্রতিস্থাপনের উদাহরণ এই উদাহরণে 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

পিএইচপিএমআইএডমিনে একটি ঝরঝরে সন্ধান এবং প্রতিস্থাপন সরঞ্জাম অন্তর্ভুক্ত।

সারণিটি নির্বাচন করুন, তারপরে অনুসন্ধান > সন্ধান করুন এবং প্রতিস্থাপন টিপুন

এই প্রশ্নের সাথে এক মিনিট সম্পর্কে নেন এবং সফলভাবে কয়েক হাজার দৃষ্টান্ত প্রতিস্থাপিত oldurl.extসঙ্গে newurl.extকলামের মধ্যেpost_content

পিএইচপিএমআইএডমিনে সন্ধান এবং প্রতিস্থাপন বৈশিষ্ট্যের স্ক্রিনশট

এই পদ্ধতি সম্পর্কে সেরা জিনিস: প্রতিশ্রুতিবদ্ধ হওয়ার আগে আপনি প্রতিটি ম্যাচ পরীক্ষা করতে পারেন।

এনবি আমি পিএইচপিএমআইএডমিন ব্যবহার করছি 4.9.0.1


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

আপনি যদি ইতিবাচক হন যে আপডেট হওয়া ক্ষেত্রগুলির কোনওটিই সিরিয়ালযুক্ত নয়, তবে উপরের সমাধানগুলি ভালভাবে কাজ করবে।

তবে, যে ক্ষেত্রগুলি আপডেট করার দরকার রয়েছে সেগুলির মধ্যে যদি সিরিয়ালযুক্ত ডেটা, একটি এসকিউএল ক্যোয়ারী বা একটি সন্ধানী অনুসন্ধান / একটি ডাম্প ফাইলে সরল সন্ধান / প্রতিস্থাপন থাকে তবে সিরিয়ালাইজেশনটি ভেঙে যাবে (যদি না পরিবর্তিত স্ট্রিংটিতে সন্ধানের স্ট্রিংয়ের মতো অক্ষরের সংখ্যা না থাকে) has

নিশ্চিত হওয়ার জন্য, একটি "সিরিয়ালাইজড" ক্ষেত্রটি এরকম দেখাচ্ছে:

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

প্রাসঙ্গিক ডেটাতে অক্ষরের সংখ্যা ডেটা অংশ হিসাবে এনকোড করা হয়।
সিরিয়ালাইজেশন হ'ল "অবজেক্টস" কে সহজেই একটি ডাটাবেসে সঞ্চিত বিন্যাসে রূপান্তর করার বা বিভিন্ন ভাষার মধ্যে সহজেই অবজেক্টের ডেটা পরিবহনের একটি উপায়।
এখানে অবজেক্টের ডেটা ক্রমিকায়িত করতে ব্যবহৃত বিভিন্ন পদ্ধতির ব্যাখ্যা এবং আপনি কেন এটি করতে চাইতে পারেন এবং এখানে একটি ওয়ার্ডপ্রেস কেন্দ্রিক পোস্ট: সিরিয়ালযুক্ত ডেটা, এর অর্থ কী এবং কেন এটি এত গুরুত্বপূর্ণ? সরল ভাষায়।

আশ্চর্যজনক হবে যে মাইএসকিউএল স্বয়ংক্রিয়ভাবে সিরিয়ালযুক্ত তথ্য হ্যান্ডেল করার জন্য কিছু সরঞ্জাম তৈরি করে থাকলেও তা হয় না, এবং যেহেতু বিভিন্ন সিরিয়ালাইজেশন ফর্ম্যাট রয়েছে তাই এটি এটি করার জন্য এমনকি বোধগম্যও হবে না।

wp-cli
উপরের উত্তরগুলির মধ্যে কয়েকটি ওয়ার্ডপ্রেস ডেটাবেসগুলিতে সুনির্দিষ্ট বলে মনে হয়েছিল, যা এর অনেকগুলি ডেটা সিরিয়ালাইজ করে। ওয়ার্ডপ্রেস একটি কমান্ড লাইন সরঞ্জাম, ডাব্লুপি অনুসন্ধান অনুসন্ধান-প্রতিস্থাপন , যা সিরিয়ালাইজেশন পরিচালনা করে offers
একটি বেসিক কমান্ড হবে:

    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পতাকাটি যুক্ত করেছি যাতে একটি অনুলিপি-পেস্ট স্বয়ংক্রিয়ভাবে কারও ডেটাবেস নষ্ট করে না। স্ক্রিপ্টটি আপনি যা চান তা নিশ্চিত হওয়ার পরে, পতাকাটি ছাড়াই আবার চালনা করুন।

প্লাগইন
যদি আপনি ওয়ার্ডপ্রেস ব্যবহার করে থাকেন তবে অনেকগুলি বিনামূল্যে এবং বাণিজ্যিক প্লাগইন উপলব্ধ রয়েছে যা অনেকগুলি অতিরিক্ত বৈশিষ্ট্যযুক্ত প্যাকেজযুক্ত একই কাজ করার জন্য একটি গুই ইন্টারফেস সরবরাহ করে।

আন্তঃসংযোগ / এটি পিএইচপি স্ক্রিপ্ট
আন্তঃসংযোগ / এটি সিরিয়ালযুক্ত ডেটা হ্যান্ডেল করার জন্য একটি পিএইচপি স্ক্রিপ্ট প্রস্তাব করে: নিরাপদ অনুসন্ধান এবং প্রতিস্থাপন সরঞ্জাম। এটি ওয়ার্ডপ্রেস সাইটগুলিতে ব্যবহারের জন্য তৈরি করা হয়েছিল, তবে দেখে মনে হচ্ছে এটি পিএইচপি দ্বারা সিরিয়ালযুক্ত কোনও ডাটাবেসে ব্যবহার করা যেতে পারে।
নিজেই ওয়ার্ডপ্রেস সহ অনেকগুলি সংস্থা এই সরঞ্জামটির সুপারিশ করে। এখানে পৃষ্ঠাগুলি সম্পর্কে প্রায় 3/4 নির্দেশাবলী


1

সর্বোত্তম আপনি এটিকে এসকিএল ফাইল হিসাবে রফতানি করুন এবং ভিজ্যুয়াল স্টুডিও কোডের মতো সম্পাদক সহ এটি খুলুন এবং আপনার শব্দগুলি সন্ধান এবং পুনঃস্থাপন করুন। আমি ১ গিগ ফাইল স্কুএলে ১ মিনিটের মধ্যে ১ 16 শব্দের জন্য প্রতিস্থাপন করেছি যা মোট 14600 শব্দ। এটি সেরা উপায়। এবং এটি সংরক্ষণ করুন এবং এটি আবার আমদানি করুন। আমদানির জন্য জিপ দিয়ে সংকোচনে ভুলে যাবেন না।


0

পরিবর্তন এসকিউএল কোয়েরি (দ্রুত) উত্পন্ন করুন

mysql -e "নির্বাচন করুন কনক্যাট ('আপডেট', টেবিলের নাম, 'সেট', কলাম_নাম, '= প্রতিস্থাপন (', কলাম_নাম, ',' 'www.oldsite.com' ',' 'www.newsite.com' '); ') বিবৃতি হিসাবে তথ্য থেকে তথ্য_চেমি কলামগুলি যেখানে টেবিলের নাম পছন্দ' wp_% '"- আপনি মূল_p আপনার_ডিবি_নামে> আপগ্রেড_স্ক্রিপ্ট.এসকিউএল

ফাইলের শুরুতে যে কোনও আবর্জনা সরান। আমার কিছু ছিল।

ন্যানো আপগ্রেড_স্ক্রিপ্ট.এসকিউএল

ত্রুটিগুলি এড়ানোর জন্য - ফোর্স অপশন সহ উত্পন্ন স্ক্রিপ্টটি চালান। (স্লো - বড় ডিবি হলে একটি কফি গ্রহন করুন)

mysql -u root -p আপনার_ডিবি_নাম_এখানে - ফোর্সেস <আপগ্রেড_সক্রিপশন.এসকিউএল


0

বড় হাতের অক্ষরের সাথে ছোট হাতের অক্ষরের বাক্যগুলির ক্ষেত্রে, আমরা বিনয়ের প্রত্যাশা ব্যবহার করতে পারি

UPDATE `table_1`  SET  `field_1` =  BINARY REPLACE(`field_1`, 'find_string', 'replace_string')
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.