Zoek en vervang tekst in de hele tabel met een MySQL-query

Meestal gebruik ik handmatig zoeken om tekst in een MySQL-database te vervangen met behulp van phpmyadmin. Ik ben het nu beu, hoe kan ik een query uitvoeren om een tekst te vinden en te vervangen door nieuwe tekst in de hele tabel in phpmyadmin?

Voorbeeld: zoek trefwoord domain.com, vervang door www.domain.com.


Antwoord 1, autoriteit 100%

Voor een single tableupdate

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

Van multiple tables

Als u van alle tabellen wilt bewerken, kunt u het beste de dumpnemen en vervolgens find/replaceen deze weer uploaden.


Antwoord 2, autoriteit 9%

De gemakkelijkste manier die ik heb gevonden, is door de database naar een tekstbestand te dumpen, een sed-opdracht uit te voeren om de vervanging uit te voeren en de database opnieuw in MySQL te laden.

Alle onderstaande commando’s zijn bash op Linux.

Dump database naar tekstbestand

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

Voer de opdracht sed uit om de doelreeks te zoeken/vervangen

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

Laad de database opnieuw in MySQL

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

Easy peasy.


Antwoord 3, autoriteit 4%

Zet dit in een php-bestand en voer het uit en het zou moeten doen wat je wilt.

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

Antwoord 4, autoriteit 4%

Een SQL-query uitvoeren in PHPmyadmin om tekst in alle wordpress-blogposts te zoeken en te vervangen, zoals het vinden van mysite.com/wordpress en dat te vervangen door mysite.com/news
Tabel in dit voorbeeld is tj_posts

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

Antwoord 5, autoriteit 2%

Een andere optie is om de instructies voor elke kolom in de database te genereren:

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

Dit zou een lijst met update-instructies moeten genereren die u vervolgens kunt uitvoeren.


Antwoord 6

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

Als ik bijvoorbeeld alle exemplaren van John door Mark wil vervangen die ik hieronder zal gebruiken,

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

Antwoord 7

phpMyAdmin bevat een handige tool voor zoeken en vervangen.

Selecteer de tafel en druk vervolgens op Zoeken> Zoeken en vervangen

Deze zoekopdracht duurde ongeveer een minuut en heeft met succes enkele duizenden exemplaren van oldurl.extvervangen door de newurl.extin kolom post_content

screenshot van de zoek-en-vervang functie in phpmyadmin

Het beste van deze methode: je kunt elke wedstrijd controleren voordat je je vastlegt.

NB Ik gebruik phpMyAdmin 4.9.0.1


Antwoord 8

Als u zeker weet dat geen van de velden die moeten worden bijgewerkt, geserialiseerd zijn, werken de bovenstaande oplossingen goed.

Als een van de velden die moeten worden bijgewerkt echter geserialiseerde gegevens bevatten, zal een SQL-query of een eenvoudige zoekopdracht/vervanging in een dumpbestand de serialisatie verbreken (tenzij de vervangen tekenreeks exact hetzelfde aantal tekens heeft als de gezochte tekenreeks ).

Voor de zekerheid ziet een veld met “serienummer” er als volgt uit:

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

Het aantal tekens in de relevante gegevens wordt gecodeerd als onderdeel van de gegevens.
Serialisatie is een manier om ‘objecten’ om te zetten in een formaat dat gemakkelijk in een database kan worden opgeslagen, of om objectgegevens gemakkelijk tussen verschillende talen te transporteren.
Hier is een uitleg van verschillende methodendie worden gebruikt om objectgegevens te serialiseren, en waarom u dit misschien wilt doen, en hier is een WordPress-centrische post: Geserialiseerde gegevens, wat betekent dat en waarom is het zo belangrijk? in gewone taal.

Het zou verbazingwekkend zijn als MySQL een ingebouwde tool had om geserialiseerde gegevens automatisch te verwerken, maar dat is niet het geval, en aangezien er verschillende serialisatie-indelingen zijn, zou het zelfs niet logisch zijn om dit te doen.

wp-cli
Sommige van de bovenstaande antwoorden leken specifiek voor WordPress-databases, die veel van zijn gegevens serialiseren. WordPress biedt een opdrachtregeltool, wp search-replace, die verhandeltserialisatie.
Een basiscommando zou zijn:

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

WordPress benadrukt echter dat de guidmag nooit worden gewijzigd, dus het raadt aan die kolom over te slaan.
Het suggereert ook dat je vaak de tabel wp_userswilt overslaan.
Zo zou dat eruit zien:

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

Opmerking: ik heb de vlag --dry-runtoegevoegd zodat kopiëren en plakken niet automatisch iemands database verpest. Nadat u zeker weet dat het script doet wat u wilt, voert u het opnieuw uit zonder die vlag.

Plug-ins

Other episodes