İçeriğe geç
KAMPANYA Kurumsal Web Paketi — $499'dan başlayan fiyatlar Web & Logo Tasarımı · Kurumsal E-posta · LiteSpeed + CloudLinux · Imunify360 Güvenlik · cPanel Yönetim · 3 Gbps DDoS Koruması 00 Gün 00 Saat 00 Dk 00 Sn
AIOR

How to Find and Replace a Word Across SQL Tables — Practical Methods

Sektör topluluğu — sorularınız, deneyimleriniz ve duyurularınız için.

How to Find and Replace a Word Across SQL Tables — Practical Methods

Aior

Administrator
Staff member
Joined
Apr 2, 2023
Messages
895
Reaction score
2
Points
18
Age
40
Location
Turkey
Website
aior.com
1/3
Thread owner

Veritabanında bir kelimenin toplu olarak güncellenmesi yaygın bir ihtiyaçtır: domain değişikliği sonrası eski alan adının metin kayıtlarından temizlenmesi, marka adının değiştirilmesi, kırık linklerin düzeltilmesi veya hatalı bir karakter dönüşümünün geri alınması bu kategoriye girer. MySQL ve MariaDB üzerinde bu işi güvenli ve geri dönülebilir biçimde yapmak için bir avuç araç ve dikkat etmeniz gereken küçük detaylar vardır.

1) Yedek almadan başlamayın
Büyük UPDATE komutlarından önce mutlaka tablo veya veritabanı yedeği alın. Tek bir komut için:
Code:
mysqldump -u root -p dbname tablename > /home/aior/backups/tablename_$(date +%F).sql
Yedek almadan UPDATE çalıştırmak, beklenmedik LIKE eşleşmeleri yüzünden veri kaybına neden olabilir.

2) Önce SELECT ile gözleyin
Doğrudan UPDATE'e geçmeden, etkilenecek satırları SELECT ile kontrol edin:
Code:
SELECT id, column FROM tablename WHERE column LIKE '%eski-kelime%' LIMIT 50;
Beklenen sayıdan çok daha fazla satır eşleşiyorsa, koşulu daraltmak gerekir. Aksi halde yan etki ürettiniz demektir.

3) Tek tabloda REPLACE() kullanımı
Standart yaklaşım, MySQL'in dahili REPLACE() fonksiyonudur:
Code:
UPDATE tablename
SET content_column = REPLACE(content_column, 'eski-kelime', 'yeni-kelime')
WHERE content_column LIKE '%eski-kelime%';
WHERE koşulu, ilgisiz satırların gereksiz yere yazılmasını engeller ve replication trafiğini düşürür. REPLACE() büyük/küçük harf ayrımına duyarlıdır; gerek varsa LOWER() ile birleştirin.

4) Birden çok kolonda toplu güncelleme
İçerik sistemlerinde aynı kelime birden çok kolonda yer alabilir (title, body, excerpt). Her kolon için ayrı UPDATE yazmak yerine tek tabloda birleştirilmiş bir komut yazılabilir:
Code:
UPDATE wp_posts
SET post_title   = REPLACE(post_title,   'eski', 'yeni'),
    post_content = REPLACE(post_content, 'eski', 'yeni'),
    post_excerpt = REPLACE(post_excerpt, 'eski', 'yeni')
WHERE post_title LIKE '%eski%' OR post_content LIKE '%eski%' OR post_excerpt LIKE '%eski%';

5) Veritabanı genelinde tarama
Hangi tablolarda eski kelimenin bulunduğunu bilmiyorsanız, INFORMATION_SCHEMA üzerinden dinamik tarama yararlıdır:
Code:
SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'dbname'
  AND DATA_TYPE IN ('text','varchar','mediumtext','longtext');
Çıktıdan kendiniz bir UPDATE listesi üretebilir veya Python/PHP betikleriyle her metin kolonu için REPLACE çağrısı dolaştırabilirsiniz.

6) Serialize edilmiş veri uyarısı
WordPress meta tabloları, Drupal config kayıtları ve bazı CMS'lerin ayar alanları PHP serialize ile saklanır. REPLACE() bu alanlarda string uzunluk başlığını (s:6:"eski") bozar ve veri okunamaz hâle gelir. Bu durumda "Better Search Replace" gibi serialize-aware bir araç veya wp search-replace WP-CLI komutunu kullanın.

7) Performans ve kilitler
Büyük tablolarda UPDATE komutu satır kilitleri oluşturur; üretim trafiğine etki edebilir. Tablonun trafiği yoğunsa parçalı UPDATE'ler yapın:
Code:
UPDATE tablename SET col = REPLACE(col,'a','b') WHERE id BETWEEN 1 AND 10000;
Aralıkları kademeli artırın; her seferinde index üzerinden çalıştığı için kilitler kısa sürer.

8) Doğrulama ve geri alma
İşlem sonrası SELECT COUNT(*) ile etkilenen satır sayısını kontrol edin. Yanlış bir güncelleme olduysa yedekten dönüş için:
Code:
mysql -u root -p dbname < /home/aior/backups/tablename_2026-05-12.sql
Bu adımlar, SQL kelime değiştirme işlemini güvenli, izlenebilir ve geri alınabilir kılar; özellikle çoklu siteli sunucularda zorunlu disiplinlerden biridir.


Replacing a word in bulk across SQL tables is a routine operation: cleaning up a legacy domain after a migration, switching a brand name, fixing a broken hyperlink template or undoing an erroneous character encoding pass. MySQL and MariaDB ship the primitives you need, but doing the work safely and reversibly takes a few habits worth committing to muscle memory.

1) Take a backup first
Always dump the table or schema before running a wide UPDATE:
Code:
mysqldump -u root -p dbname tablename > /home/aior/backups/tablename_$(date +%F).sql
Running UPDATE blind is one of the few ways to lose data silently — an unintended LIKE match can rewrite thousands of rows that you cannot easily diff later.

2) Preview with SELECT
Run the same predicate as SELECT before the UPDATE:
Code:
SELECT id, column FROM tablename WHERE column LIKE '%old-word%' LIMIT 50;
If the count is wildly higher than expected, tighten the predicate. Treat the preview as a tripwire — it is the cheapest way to spot a wrong assumption before you commit.

3) Single-table REPLACE()
The canonical approach uses MySQL's built-in REPLACE():
Code:
UPDATE tablename
SET content_column = REPLACE(content_column, 'old-word', 'new-word')
WHERE content_column LIKE '%old-word%';
The WHERE clause avoids rewriting unaffected rows, which keeps replication chatter low. REPLACE() is case-sensitive — combine with LOWER() when you genuinely need a case-insensitive sweep.

4) Multi-column updates
When the same word appears in several columns (title, body, excerpt), combine them in a single statement:
Code:
UPDATE wp_posts
SET post_title   = REPLACE(post_title,   'old', 'new'),
    post_content = REPLACE(post_content, 'old', 'new'),
    post_excerpt = REPLACE(post_excerpt, 'old', 'new')
WHERE post_title LIKE '%old%' OR post_content LIKE '%old%' OR post_excerpt LIKE '%old%';

5) Schema-wide discovery
When you do not yet know which tables hold the word, walk INFORMATION_SCHEMA:
Code:
SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'dbname'
  AND DATA_TYPE IN ('text','varchar','mediumtext','longtext');
Generate the UPDATE list from that output, or wrap it in a Python/PHP harness that iterates each text column with a REPLACE.

6) Serialised-data caveat
WordPress meta tables, Drupal config and many CMS option fields store PHP-serialised data. REPLACE() corrupts the string length header (s:3:"old" vs s:3:"new") and breaks the record. Use a serialisation-aware tool: Better Search Replace plugin, or wp search-replace from WP-CLI.

7) Performance and locking
Large UPDATEs take row-level locks that can affect live traffic. Break the work into chunks:
Code:
UPDATE tablename SET col = REPLACE(col,'a','b') WHERE id BETWEEN 1 AND 10000;
Walk the id space in batches; each chunk holds locks briefly and the index makes the work linear.

8) Verification and rollback
After the run, SELECT COUNT(*) for any remaining matches. If the change went wrong, restore from the dump:
Code:
mysql -u root -p dbname < /home/aior/backups/tablename_2026-05-12.sql
These habits make SQL find-and-replace a safe, auditable, repeatable operation — the kind of discipline that pays off most visibly on shared servers running many sites.
 
Last edited:

Forum statistics

Threads
891
Messages
898
Members
27
Latest member
AIORAli

Members online

No members online now.

Featured content

AIOR
AIOR TEKNOLOJİ

Tüm ihtiyaçlarınız için Teklif alın

Hosting · Domain · Sunucu · Tasarım · Yazılım · Mühendislik · Sektörel Çözümler

Teklif al

7/24 Destek · Anında yanıt

Back
Top