Знайдіть і замініть текст у всій таблиці за допомогою запиту MySQL


235

Зазвичай я використовую вручну пошук для заміни тексту в базі даних MySQL за допомогою phpmyadmin. Мені це вже набридло, як я можу запустити запит, щоб знайти та замінити текст новим текстом у всій таблиці phpmyadmin?

Приклад: знайти ключове слово domain.com, замінити на www.domain.com.


Можливий дублікат stackoverflow.com/questions/639531 / ...
Сель

1
Ви можете зробити щось подібне [це] [1]. [1]: stackoverflow.com/questions/562457/…
Pramod

2
Це допоможе вам досягти того, що вам потрібно.
Дом,

Можливий дублікат рядка MySQL замінити
Стів Чемберс

Відповіді:


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
і він замінить 'domain.com' на 'www.domain.com' та 'www.domain.com' на 'www.www.domain.com'
michelek

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.

Усі команди нижче є 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

Простенька.


2
Це працює надзвичайно швидко. Я люблю це рішення. Мені довелося зробити кілька замін URL-адрес, і замість того, щоб використовувати косої риски в якості розділювачів, я використовував труби (читайте це до grymoire.com/Unix/Sed.html ). Приклад: sed -i 's | olddomain.com | http: //newdomain.com | g './db.sql
Майк Корменді

1
Це було так швидко, я думав, що це не працює. Але це вдалося! Крім того, ви можете просто уникнути \/\/domain.com
косої

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

Не працювало для мене, приємна пропозиція, хоча - було б солодко
AlexHighHigh

23

Запуск SQL-запиту в PHPmyadmin для пошуку та заміни тексту у всіх публікаціях блогу Wordpress, таких як пошук mysite.com/wordpress та заміна цього на mysite.com/news Таблиця в цьому прикладі - це_пости

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
Повільніше, ніж демпінг, але для людей, які не відчувають себе комфортно з командним рядком, ця відповідь є творчою та ефективною.
Стефан

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.extстовпчик у межах стовпцяpost_content

скріншот функції пошуку та заміни в phpMyAdmin

Найкраще про цей метод: Ви маєте перевірити кожну відповідність, перш ніж здійснити.

Примітка: Я використовую phpMyAdmin 4.9.0.1


2

Я вважаю, що відповідь "свопнеш" найкращою! На жаль, я не зміг його виконати в 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-запит або звичайний пошук / заміна в дамп-файлі порушить серіалізацію (якщо тільки замінена рядок не має точно такої ж кількості символів, що і пошуковий рядок).

Напевно, "серіалізоване" поле виглядає приблизно так:

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 gig-файл sql за 1 хвилину на 16 слів, що загалом становить 14600 слово. це найкращий спосіб. а після заміни збережіть та імпортуйте знову. не забувайте стискати його на блискавці для імпорту.


0

Створення SQL запитів зміни (FAST)

mysql -e "SELECT CONCAT ('оновлення', ім'я таблиці_набір, 'набір', ім'я стовпця, '= заміна (', ім'я стовпця, ',' 'www.oldsite.com' ',' 'www.newsite.com' '); ') AS твердження FROM information_schema.columns WHERE ім'я_матеріалу LIKE' wp_% '"-u root -p your_db_name_here> upgrade_script.sql

Видаліть сміття на початку файлу. У мене були деякі.

nano upgrade_script.sql

Запустіть створений сценарій з --force параметрами, щоб пропустити помилки. (Повільно - візьміть каву, якщо великий DB)

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


0

У випадку речень з великими літерами - малими літерами, ми можемо використовувати БІНАРНУ ВІДПОВІДЬ

UPDATE `table_1`  SET  `field_1` =  BINARY REPLACE(`field_1`, 'find_string', 'replace_string')
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.