Найти и заменить текст во всей таблице с помощью запроса MySQL

Обычно я использую ручной поиск для замены текста в базе данных MySQL с использованием phpmyadmin. Я устал от этого сейчас, как я могу запустить запрос, чтобы найти и заменить текст новым текстом во всей таблице в phpmyadmin?

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

Ответ 1

При обновлении single table

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

Из multiple tables -

Если вы хотите редактировать из всех таблиц, лучший способ - взять dump, а затем find/replace и загрузить его обратно.

Ответ 2

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

Ответ 3

Поместите это в 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']);
}

Ответ 4

Запуск 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')

Ответ 5

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

Как, например, если я хочу заменить все вхождения Джона Марком, я буду использовать ниже,

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

Ответ 6

Другой вариант - сгенерировать операторы для каждого столбца в базе данных:

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

Это должно сгенерировать список операторов обновлений, которые вы затем можете выполнить.

Ответ 7

Я считаю, что "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`;

Ответ 8

Сгенерировать SQL-запросы с изменениями (FAST)

mysql -e "SELECT CONCAT ('update', table_name, 'set', column_name, '= replace (', column_name, ',' 'www.oldsite.com' ',' 'www.newsite.com' ');') AS statement FROM information_schema.columns WHERE имя_таблицы LIKE 'wp_%'" -u root -p your_db_name_here > upgrade_script.sql

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

nano upgrade_script.sql

Выполнить сгенерированный script с параметрами --force для пропуска ошибок. (SLOW - захватите кофе, если большая БД)

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

Ответ 9

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

Ответ 10

Если вы уверены, что ни одно из полей, подлежащих обновлению, не будет сериализовано, приведенные выше решения будут работать хорошо.

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

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

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

Количество символов в соответствующих данных кодируется как часть данных. Это способ легко конвертировать "объекты" в формат, который легко хранится в базе данных. Вот объяснение того, как, почему и различные методы, используемые для сериализации данных объекта. Вот другое описание, но простым языком.

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

сор-кли
Некоторые из приведенных выше ответов казались специфичными для баз данных 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 чтобы копировать-вставку автоматически не --dry-run базу данных. Убедившись, что скрипт выполняет то, что вам нужно, запустите его снова без этого флага.

Плагины
Если вы используете WordPress, есть также много бесплатных и коммерческих плагинов, которые предлагают графический интерфейс для того же, в комплекте со многими дополнительными функциями.

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