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 table
update
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 dump
nemen en vervolgens find/replace
en 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.ext
vervangen door de newurl.ext
in kolom post_content
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 guid
mag nooit worden gewijzigd, dus het raadt aan die kolom over te slaan.
Het suggereert ook dat je vaak de tabel wp_users
wilt 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-run
toegevoegd 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