ค้นหาและแทนที่ข้อความในตารางทั้งหมดโดยใช้แบบสอบถาม MySQL


235

ฉันมักจะใช้ค้นหาด้วยตนเองเพื่อแทนที่ข้อความในฐานข้อมูล MySQL โดยใช้ phpmyadmin ตอนนี้ฉันเบื่อแล้วฉันจะเรียกใช้คิวรีเพื่อค้นหาและแทนที่ข้อความด้วยข้อความใหม่ในตารางทั้งหมดใน phpmyadmin ได้อย่างไร

ตัวอย่าง: ค้นหาคำหลักแทนที่ด้วยdomain.comwww.domain.com


ซ้ำเป็นไปได้ของstackoverflow.com/questions/639531/...
SEL

1
คุณสามารถทำบางสิ่งเช่น [นี่] [1] [1]: stackoverflow.com/questions/562457/…
Pramod

2
สิ่งนี้จะช่วยให้คุณบรรลุสิ่งที่คุณต้องการ
Dom

สำเนาซ้ำที่เป็นไปได้ของสตริง MySQL
Steve Chambers

คำตอบ:


551

สำหรับการsingle tableอัพเดท

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

จากmultiple tables-

หากคุณต้องการแก้ไขจากตารางทั้งหมดวิธีที่ดีที่สุดคือนำdumpและจากนั้นfind/replaceอัปโหลดกลับมา


4
สิ่งนี้จะแทนที่ทั้งฟิลด์หรือว่าซับสตริงตรงกันภายในฟิลด์หรือไม่
Randy Greencorn

3
มันจะแทนที่สตริงย่อยภายในฟิลด์ @RandyGreencorn นอกจากนี้ยังเป็นกรณี ๆ ไป
แอนดรู

10
และจะแทนที่ 'domain.com' ด้วย 'www.domain.com' และ 'www.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 "s:unwanted_text:wanted_text:g" dump.sql
kakoma

2
ใช้งานได้ดี ตามที่คนอื่นได้กล่าวไว้บางครั้งฉันต้องยุ่งกับคำพูดเพื่อให้มันทำงานใน phpMyAdmin ฉันใช้เพื่อแทนที่เฉพาะข้อความ "http:" ด้วย "https:" ในคอลัมน์ที่มีที่อยู่เว็บแบบเต็ม ที่อยู่ส่วนที่เหลือของเว็บไม่มีการแตะต้อง
Heres2u

40

วิธีที่ง่ายที่สุดที่ฉันพบคือการถ่ายโอนฐานข้อมูลไปยังไฟล์ข้อความเรียกใช้คำสั่ง sed เพื่อทำการแทนที่และโหลดฐานข้อมูลกลับเข้าไปใน MySQL

คำสั่งทั้งหมดด้านล่างเป็น bash บน Linux

ถ่ายโอนฐานข้อมูลไปยังไฟล์ข้อความ

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

เรียกใช้คำสั่ง sed เพื่อค้นหา / แทนที่สตริงเป้าหมาย

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

โหลดฐานข้อมูลลงใน MySQL

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

peasy ง่าย ๆ


2
มันใช้งานได้เร็วอย่างน่าอัศจรรย์ ฉันรักทางออกนี้ ฉันต้องเปลี่ยน url แทนการใช้เครื่องหมายทับแทนตัวคั่นฉันใช้ไพพ์แทน (อ่านgrymoire.com/Unix/Sed.htmlนี้แทน ) ตัวอย่าง: sed -i 's | olddomain.com | http: //newdomain.com | g './db.sql
Mike Kormendy

1
มันเร็วมากฉันคิดว่ามันใช้งานไม่ได้ แต่มันก็ทำ! นอกจากนี้คุณยังสามารถหลบหลีก slashes เช่นนี้:\/\/domain.com
m.cichacz

2
เพียงเตือนความจำว่าใน OS X sed -iคำสั่งอาจทำให้เกิดunterminated substitute patternข้อผิดพลาด คุณสามารถใช้sed -i '' -e 's/oldString/newString/g' ./db.sqlแทน
afterglowlee

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

ไม่ได้ผลสำหรับฉัน แต่ข้อเสนอแนะที่ดี - น่ารัก
จัง

23

ใช้การสืบค้น SQL ใน PHPmyadmin เพื่อค้นหาและแทนที่ข้อความในทุกบล็อกของ wordpress เช่นการค้นหา mysite.com/wordpress และแทนที่ด้วย mysite.com/news Table ในตัวอย่างนี้คือ tj_posts

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

2
ขอบคุณสำหรับการค้นหา สำหรับเว็บไซต์ WordPress ของฉันชื่อคอลัมน์นั้นจะwp_postsมีลักษณะของการค้นหาUPDATE `wp_posts` SET `post_content` = replace(post_content, 'mysite.com/wordpress', 'mysite.com/news')
Maris B.

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
ช้ากว่าการทุ่มตลาด แต่สำหรับคนที่ไม่รู้สึกพอใจกับบรรทัดคำสั่งคำตอบนี้สร้างสรรค์และมีประสิทธิภาพ
Stephane

3
นี่เป็นวิธีที่ดีที่สุดหากคุณมีข้อมูลจำนวนมากและไม่สามารถถ่ายโอน / โหลดซ้ำได้
Kariem

โอ้คนนี้ใช้งานได้ดี! ฉันจะแบ่งปันสคริปต์ของฉันตามแนวคิดนี้
Andy

นี่เป็นวิธีแก้ปัญหาที่ประเมินค่าไม่ได้ ทำงานให้ฉันโดยสิ้นเชิง
rw-intechra

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

เช่นถ้าฉันต้องการแทนที่ John ทั้งหมดด้วย Mark ฉันจะใช้ด้านล่าง

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

3

phpMyAdmin มีเครื่องมือค้นหาและแทนที่ที่เป็นระเบียบ

เลือกตารางจากนั้นกดค้นหา > ค้นหาและแทนที่

แบบสอบถามนี้ใช้เวลาประมาณหนึ่งนาทีและแทนที่อินสแตนซ์หลายพันรายการoldurl.extด้วยnewurl.extภายในคอลัมน์post_content

สกรีนช็อตของคุณสมบัติค้นหาและแทนที่ใน phpMyAdmin

สิ่งที่ดีที่สุดเกี่ยวกับวิธีนี้: คุณจะต้องตรวจสอบทุกนัดก่อนที่จะทำ

NB ฉันใช้ phpMyAdmin 4.9.0.1


2

ฉันเชื่อว่าคำตอบ "swapnesh" จะดีที่สุด! น่าเสียดายที่ฉันไม่สามารถเรียกใช้งานได้ใน phpMyAdmin (4.5.0.2) ซึ่งถึงแม้ว่าไร้เหตุผล (และลองหลายสิ่ง) มันยังคงบอกว่ามีการพบคำสั่งใหม่และไม่พบตัวคั่น ...

ดังนั้นฉันจึงมาพร้อมกับวิธีแก้ไขปัญหาต่อไปนี้ที่อาจเป็นประโยชน์หากคุณใช้งานปัญหาเดียวกันและไม่มีการเข้าถึงฐานข้อมูลอื่นนอกเหนือจาก PMA ...

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 Query หรือการค้นหา / แทนที่อย่างง่าย ๆ ในไฟล์การถ่ายโอนข้อมูลจะแบ่งการทำให้เป็นอนุกรม (เว้นแต่ว่าสตริงที่ถูกแทนที่นั้น

เพื่อให้แน่ใจว่าฟิลด์ "ต่อเนื่อง" จะมีลักษณะดังนี้:

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

จำนวนอักขระในข้อมูลที่เกี่ยวข้องถูกเข้ารหัสเป็นส่วนหนึ่งของข้อมูล
การจัดลำดับเป็นวิธีการแปลง "วัตถุ" เป็นรูปแบบที่เก็บไว้ในฐานข้อมูลได้อย่างง่ายดายหรือเพื่อการขนส่งข้อมูลวัตถุระหว่างภาษาต่างๆ
นี่คือคำอธิบายของวิธีการต่าง ๆ ที่ใช้ในการซีเรียลไลซ์ข้อมูลวัตถุและสาเหตุที่คุณอาจต้องการทำเช่นนั้นและนี่คือโพสต์ที่มี WordPress เป็นศูนย์กลาง: ข้อมูลต่อเนื่องนั่นหมายถึงอะไรและทำไมมันจึงสำคัญในภาษาธรรมดา

มันจะน่าอัศจรรย์ถ้า MySQL มีเครื่องมือในตัวที่จะจัดการข้อมูลต่อเนื่องโดยอัตโนมัติ แต่มันไม่ได้และเนื่องจากมีรูปแบบการทำให้เป็นอันดับที่แตกต่างกันมันจะไม่เหมาะสมที่จะทำเช่นนั้น

wp-cli
คำตอบบางข้อข้างต้นดูเหมือนเฉพาะกับฐานข้อมูล WordPress ซึ่งเรียงลำดับข้อมูลเป็นส่วนใหญ่ WordPress มีเครื่องมือบรรทัดคำสั่งWP ค้นหาแทนที่ที่จะจับเป็นอันดับ
คำสั่งพื้นฐานจะเป็น:

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

อย่างไรก็ตาม WordPress เน้นว่า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ตั้งค่าสถานะเพื่อคัดลอกวางจะไม่ทำลายฐานข้อมูลของทุกคนโดยอัตโนมัติ หลังจากคุณแน่ใจแล้วว่าสคริปต์ทำในสิ่งที่คุณต้องการเรียกใช้อีกครั้งโดยไม่มีการตั้งค่าสถานะนั้น

ปลั๊กอิน
หากคุณใช้ WordPress มีปลั๊กอินฟรีและเชิงพาณิชย์มากมายที่มีอินเทอร์เฟซ gui ให้ทำเช่นเดียวกันบรรจุด้วยคุณสมบัติเพิ่มเติมมากมาย

Interconnect / it php script
Interconnect / มีสคริปต์ php เพื่อจัดการข้อมูลที่เป็นลำดับ: เครื่องมือค้นหาและแทนที่อย่างปลอดภัย มันถูกสร้างขึ้นเพื่อใช้กับเว็บไซต์ WordPress แต่ดูเหมือนว่ามันสามารถใช้กับฐานข้อมูลใด ๆ ที่ต่อเนื่องกันด้วย PHP
บริษัท หลายแห่งรวมถึง WordPress แนะนำเครื่องมือนี้ คำแนะนำที่นี่ประมาณ 3/4 หน้า


1

ที่ดีที่สุดที่คุณส่งออกเป็นไฟล์ sql และเปิดด้วยโปรแกรมแก้ไขเช่นรหัสภาพสตูดิโอและค้นหาและเปลี่ยนคำของคุณ ฉันแทนที่ใน 1 กิ๊กไฟล์ sql ใน 1 นาทีสำหรับ 16 คำที่รวมเป็น 14,600 คำ มันเป็นวิธีที่ดีที่สุด และหลังจากแทนที่บันทึกและนำเข้าอีกครั้ง อย่าลืมบีบอัดด้วย zip เพื่อนำเข้า


0

สร้างการเปลี่ยนแปลงแบบสอบถาม SQL (FAST)

mysql -e "SELECT CONCAT ('อัพเดต', table_name, 'set', column_name, '= แทนที่ (', column_name, ',' 'www.oldsite.com' ',' 'www.newsite.com' '); ') คำสั่ง AS จาก data_schema.columns WHERE table_name เช่น' wp_% '"-u root -p your_db_name_here> upgrade_script.sql

ลบขยะใด ๆ ที่จุดเริ่มต้นของไฟล์ ฉันมีบางอย่าง

nano upgrade_script.sql

เรียกใช้สคริปต์ที่สร้างขึ้นด้วย - บังคับตัวเลือกเพื่อข้ามข้อผิดพลาด (ช้า - คว้ากาแฟถ้าฐานข้อมูลขนาดใหญ่)

mysql -u root -p your_db_name_here - บังคับ <upgrade_script.sql


0

ในกรณีของประโยคที่มีตัวพิมพ์ใหญ่ - ตัวพิมพ์เล็กเราสามารถใช้ BINARY REPACE

UPDATE `table_1`  SET  `field_1` =  BINARY REPLACE(`field_1`, 'find_string', 'replace_string')
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.