Tìm và thay thế văn bản trong toàn bộ bảng bằng truy vấn MySQL


235

Thông thường tôi sử dụng tìm thủ công để thay thế văn bản trong cơ sở dữ liệu MySQL bằng phpmyadmin. Bây giờ tôi mệt mỏi với nó, làm cách nào tôi có thể chạy truy vấn để tìm và thay thế một văn bản bằng văn bản mới trong toàn bộ bảng bằng phpmyadmin?

Ví dụ: tìm từ khóa domain.com, thay thế bằng www.domain.com.


Bản sao có thể có của stackoverflow.com/questions/639531/ Cách
sel

1
Bạn có thể làm một số thứ như [này] [1]. [1]: stackoverflow.com/questions/562456/ Lời
Pramod

2
Điều này sẽ giúp bạn đạt được những gì bạn cần.
Dom

Bản sao có thể có của chuỗi thay thế MySQL
Steve Chambers

Câu trả lời:


551

Để single tablecập nhật

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

Từ multiple tables-

Nếu bạn muốn chỉnh sửa từ tất cả các bảng, cách tốt nhất là lấy dumpvà sau đó find/replacetải lên lại.


4
Điều này có thay thế toàn bộ một trường hoặc với nó có khớp chuỗi con trong một trường không?
Randy Greencorn

3
Nó sẽ thay thế một chuỗi con trong trường @RandyGreencorn. Nó cũng phân biệt chữ hoa chữ thường.
Andrew

10
và nó sẽ thay thế 'domain.com' bằng 'www.domain.com' và 'www.domain.com' bằng 'www.www.domain.com'
michelek

2
Thông tin thêm về điều này: If you want to edit from all tables, best way is to take the dump and then find/replace and upload it back.Sử dụng sed trên bãi chứa để tìm / thay thế:sed "s:unwanted_text:wanted_text:g" dump.sql
kakoma

2
Công trình tuyệt vời. Như những người khác đã tuyên bố, đôi khi tôi phải nhầm lẫn với các trích dẫn để làm cho nó hoạt động trong phpMyAdmin. Tôi đã sử dụng nó để chỉ thay thế văn bản "http:" bằng "https:" trong một cột chứa địa chỉ web đầy đủ. Phần còn lại của các địa chỉ web đã bị ảnh hưởng.
Heres2u

40

Cách dễ nhất mà tôi đã tìm thấy là kết xuất cơ sở dữ liệu vào tệp văn bản, chạy lệnh sed để thực hiện thay thế và tải lại cơ sở dữ liệu trở lại vào MySQL.

Tất cả các lệnh dưới đây là bash trên Linux.

Kết xuất cơ sở dữ liệu vào tệp văn bản

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

Chạy lệnh sed để tìm / thay thế chuỗi mục tiêu

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

Tải lại cơ sở dữ liệu vào MySQL

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

Dễ như ăn bánh.


2
Điều này làm việc nhanh đáng kinh ngạc. Tôi thích giải pháp này. Tôi đã phải thực hiện một số thay thế url và thay vì sử dụng dấu gạch chéo như dấu phân cách của tôi, tôi đã sử dụng đường ống thay thế (đọc phần này lên grymoire.com/Unix/Sed.html ). Ví dụ: sed -i 's | olddomain.com | http: //newdomain.com | g './db.sql
Mike Kormendy

1
Nó nhanh đến mức tôi nghĩ nó không hoạt động. Nhưng nó đã làm! Ngoài ra, bạn chỉ có thể thoát dấu gạch chéo như thế này:\/\/domain.com
m.cichacz

2
Chỉ cần nhắc nhở rằng trong OS X, sed -ilệnh có thể đưa ra unterminated substitute patternlỗi. Bạn có thể sử dụng sed -i '' -e 's/oldString/newString/g' ./db.sqlthay thế.
afterglowlee

25

Đặt nó trong một tập tin php và chạy nó và nó sẽ làm những gì bạn muốn nó làm.

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

Không làm việc cho tôi, mặc dù gợi ý tốt đẹp - sẽ rất ngọt ngào
AlexHighHigh 15/10/19

23

Chạy một truy vấn SQL trong PHPmyadmin để tìm và thay thế văn bản trong tất cả các bài đăng trên blog của wordpress, chẳng hạn như tìm mysite.com/wordpress và thay thế bằng mysite.com/news Bảng trong ví dụ này là tj_posts

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

2
Cảm ơn các truy vấn. Đối với trang web WordPress của tôi, tên cột là wp_poststruy vấn có vẻUPDATE `wp_posts` SET `post_content` = replace(post_content, 'mysite.com/wordpress', 'mysite.com/news')
Maris B.

10

Một tùy chọn khác là tạo các câu lệnh cho mỗi cột trong cơ sở dữ liệu:

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_%';

Điều này sẽ tạo ra một danh sách các báo cáo cập nhật mà sau đó bạn có thể thực hiện.


2
Chậm hơn là bán phá giá, nhưng đối với những người không cảm thấy thoải mái với dòng lệnh, câu trả lời này là sáng tạo và hiệu quả.
Stephane

3
Đây là cách tiếp cận tốt nhất, nếu bạn có nhiều dữ liệu và không thể kết xuất / tải lại nó.
Kariem

Người đàn ông này đã làm việc tuyệt vời! Tôi sẽ chia sẻ kịch bản của mình dựa trên ý tưởng này
Andy

Đây là một giải pháp được đánh giá thấp. Hoàn toàn làm việc cho tôi.
rw-intechra

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

Ví dụ như, nếu tôi muốn thay thế tất cả các lần xuất hiện của John bằng Mark, tôi sẽ sử dụng bên dưới,

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

3

phpMyAdmin bao gồm một công cụ tìm và thay thế gọn gàng.

Chọn bảng, sau đó nhấn Tìm kiếm > Tìm và thay thế

Truy vấn này mất khoảng một phút và thay thế thành công vài nghìn trường hợp oldurl.extvới newurl.extCột trongpost_content

ảnh chụp màn hình của tính năng tìm và thay thế trong phpMyAdmin

Điều tốt nhất về phương pháp này: Bạn có thể kiểm tra mọi trận đấu trước khi cam kết.

NB Tôi đang sử dụng phpMyAdmin 4.9.0.1


2

Tôi tin rằng câu trả lời "hoán đổi" là tốt nhất! Thật không may, tôi không thể thực thi nó trong phpMyAdmin (4.5.0.2), mặc dù phi logic (và đã thử một số thứ), nó vẫn nói rằng một tuyên bố mới đã được tìm thấy và không tìm thấy dấu phân cách nào

Do đó, tôi đã đưa ra giải pháp sau đây có thể hữu ích nếu bạn giải quyết vấn đề tương tự và không có quyền truy cập vào cơ sở dữ liệu nào khác ngoài PMA cảm

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`;

Để kiểm tra kết quả mong đợi, bạn có thể muốn sử dụng:

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

Nếu bạn khẳng định rằng không có trường nào được cập nhật được tuần tự hóa, các giải pháp trên sẽ hoạt động tốt.

Tuy nhiên, nếu bất kỳ trường nào cần cập nhật chứa dữ liệu được tuần tự hóa, Truy vấn SQL hoặc tìm kiếm / thay thế đơn giản trên tệp kết xuất, sẽ phá vỡ tuần tự hóa (trừ khi chuỗi thay thế có cùng số lượng ký tự như chuỗi tìm kiếm).

Để chắc chắn, một trường "nối tiếp" trông như thế này:

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

Số lượng ký tự trong dữ liệu liên quan được mã hóa như một phần của dữ liệu.
Tuần tự hóa là một cách để chuyển đổi "đối tượng" thành định dạng được lưu trữ dễ dàng trong cơ sở dữ liệu hoặc để dễ dàng vận chuyển dữ liệu đối tượng giữa các ngôn ngữ khác nhau.
Dưới đây là giải thích về các phương pháp khác nhau được sử dụng để tuần tự hóa dữ liệu đối tượng và lý do tại sao bạn có thể muốn làm như vậy và đây là một bài đăng tập trung vào WordPress: Dữ liệu được tuần tự hóa, Điều đó có nghĩa gì và tại sao nó lại quan trọng như vậy? bằng ngôn ngữ đơn giản.

Thật đáng kinh ngạc nếu MySQL có một số công cụ tích hợp để tự động xử lý dữ liệu tuần tự, nhưng không, và vì có các định dạng tuần tự hóa khác nhau, nên nó thậm chí sẽ không có ý nghĩa gì khi làm như vậy.

wp-cli
Một số câu trả lời ở trên có vẻ cụ thể đối với cơ sở dữ liệu WordPress, trong đó tuần tự hóa nhiều dữ liệu của nó. WordPress cung cấp một công cụ dòng lệnh, WP tìm-thay thế , mà không xử lý tuần tự.
Một lệnh cơ bản sẽ là:

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

Tuy nhiên, WordPress nhấn mạnh rằng guidkhông bao giờ nên thay đổi , vì vậy nó khuyên bạn nên bỏ qua cột đó.
Nó cũng gợi ý rằng thường thì bạn sẽ muốn bỏ qua wp_usersbảng.
Đây là những gì sẽ trông như:

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

Lưu ý: Tôi đã thêm --dry-runcờ để sao chép-dán sẽ không tự động làm hỏng cơ sở dữ liệu của bất kỳ ai. Sau khi bạn chắc chắn tập lệnh thực hiện những gì bạn muốn, hãy chạy lại nó mà không có cờ đó.

Plugin
Nếu bạn đang sử dụng WordPress, cũng có nhiều plugin miễn phí và thương mại có sẵn giao diện gui để làm tương tự, được đóng gói với nhiều tính năng bổ sung.

Interconnect / it php script
Interconnect / nó cung cấp một tập lệnh php để xử lý dữ liệu nối tiếp: Công cụ Tìm kiếm và Thay thế An toàn . Nó được tạo ra để sử dụng trên các trang web WordPress, nhưng có vẻ như nó có thể được sử dụng trên bất kỳ cơ sở dữ liệu nào được tuần tự hóa bởi PHP.
Nhiều công ty, bao gồm cả chính WordPress, đề xuất công cụ này. Hướng dẫn ở đây, khoảng 3/4 xuống trang.


1

tốt nhất bạn xuất nó dưới dạng tệp sql và mở nó bằng trình soạn thảo như mã phòng thu trực quan và tìm và đánh giá lại các từ của bạn. tôi thay thế trong 1 gigabyte tập tin trong 1 phút cho 16 từ với tổng số là 14600 từ. cách tốt nhất của nó và sau khi thay thế nó lưu và nhập lại. đừng quên nén nó bằng zip để nhập.


0

Tạo các truy vấn SQL thay đổi (FAST)

mysql -e "CHỌN CONCAT ('update', tên_bảng, 'set', cột_name, '= thay thế (', cột_name, ',' 'www.oldsite.com' ',' 'www.newsite.com' '); ') AS tuyên bố TỪ information_schema.columns WHERE tên_bảng THÍCH' wp_% '"-u root -p your_db_name_here> nâng cấp_script.sql

Loại bỏ bất kỳ rác khi bắt đầu tập tin. Tôi đã có một số.

nâng cấp nano_script.sql

Chạy tập lệnh được tạo với các tùy chọn --force để bỏ qua lỗi. (SLOW - lấy cà phê nếu DB lớn)

gốc mys -u -p your_db_name_here --force <nâng cấp_script.sql


0

Trong trường hợp câu có chữ hoa - chữ thường, chúng ta có thể sử dụng thay thế BINary

UPDATE `table_1`  SET  `field_1` =  BINARY REPLACE(`field_1`, 'find_string', 'replace_string')
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.