Найти и заменить текст во всей таблице, используя запрос 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вместо этого.
послесвечение

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. В этом примере таблица 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
Этот ответ медленнее демпинга, но для людей, которые не чувствуют себя комфортно с командной строкой, этот ответ является творческим и эффективным.
Стефан

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

Лучшая вещь об этом методе: вы проверяете каждый матч перед фиксацией.

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 или простой поиск / замена в файле дампа прервет сериализацию (если в замененной строке не будет ровно столько же символов, что и в искомой строке).

Конечно, «сериализованное» поле выглядит так:

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

Количество символов в соответствующих данных кодируется как часть данных.
Сериализация - это способ преобразования «объектов» в формат, легко сохраняемый в базе данных, или простой перенос данных объекта между различными языками.
Вот объяснение различных методов, используемых для сериализации данных объекта, и почему вы, возможно, захотите это сделать, а также публикация, ориентированная на WordPress: Сериализованные данные, что это значит и почему это так важно? простым языком.

Было бы удивительно, если бы в MySQL был какой-то встроенный инструмент для автоматической обработки сериализованных данных, но это не так, и поскольку существуют разные форматы сериализации, для этого даже не имеет смысла делать это.

wp-cli
Некоторые ответы выше казались специфичными для баз данных WordPress, которые сериализуют большую часть своих данных. WordPress предлагает инструмент командной строки, wp search-replace , который делает сериализацию.
Основная команда будет:

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

Interconnect / it php script
Interconnect / предлагает скрипт php для обработки сериализованных данных: инструмент безопасного поиска и замены . Он был создан для использования на сайтах WordPress, но, похоже, его можно использовать в любой базе данных, сериализованной PHP.
Многие компании, включая сам WordPress, рекомендуют этот инструмент. Инструкции здесь, около 3/4 вниз по странице.


1

Лучше всего, если вы экспортируете его как файл sql и открываете его в редакторе, таком как Visual Studio Code, и находите и перераспределяете ваши слова. я заменяю в 1 гигабайтном файле sql за 1 минуту на 16 слов, что в сумме составляет 14600 слов. это лучший способ. и после замены сохраните и импортируйте снова. не забудьте сжать его с помощью zip для импорта.


0

Генерация запросов на изменение SQL (FAST)

mysql -e "SELECT CONCAT ('update', table_name, 'set', column_name, '= replace (', column_name, ',' 'www.oldsite.com' ',' 'www.newsite.com' '); ') Как оператор FROM information_schema.columns WHERE table_name LIKE' wp_% '"-u root -p your_db_name_here> upgrade_script.sql

Удалите весь мусор в начале файла. У меня было немного.

nano upgrade_script.sql

Запустите сгенерированный скрипт с опциями --force, чтобы пропустить ошибки. (МЕДЛЕННО - возьмите кофе, если большая БД)

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 и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.