String Fonksiyonları: CONCAT, SUBSTRING, UPPER, LOWER
Giriş — Metin Verisiyle Çalışmak
Veritabanındaki metinler her zaman istediğin formatta olmaz. Müşteri adı küçük harfle kaydedilmiş, e-postanın başında boşluk var, ürün adından bir kelimeyi çıkarman gerekiyor... İşte string fonksiyonları bu tür metin işlemlerini veritabanı seviyesinde yapmana olanak tanır.
🎯 Analoji: String fonksiyonlarını bir metin atölyesi gibi düşün. Elindeki metni kesebilir, birleştirebilir, büyütebilir, küçültebilir, kenarlarını düzeltebilir, parçalarını değiştirebilirsin — orijinal veriyi bozmadan.
CONCAT ve CONCAT_WS — Metin Birleştirme
CONCAT — Basit Birleştirme
-- Ad ve soyadı birleştir
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM customers;
-- "Ahmet Yılmaz", "Zeynep Kaya", ...
-- Fiyat formatlama
SELECT CONCAT('₺', price) AS formatted_price FROM products;
-- "₺54999.99", "₺64999.99", ...
-- Birden fazla parçayı birleştir
SELECT CONCAT(first_name, ' ', last_name, ' (', city, ')') AS customer_info
FROM customers;
-- "Ahmet Yılmaz (İstanbul)"⚠️ Dikkat: MySQL'de
CONCATparametrelerinden biri bile NULL ise sonuç NULL olur! ``sql SELECT CONCAT('Ahmet', NULL, 'Yılmaz'); -- NULL! -- Çözüm: COALESCE kullan SELECT CONCAT(first_name, ' ', COALESCE(last_name, ''));``
CONCAT_WS — Ayırıcı ile Birleştirme
CONCAT_WS (With Separator) ilk parametre ayırıcı, sonrakiler birleştirilecek değerler. NULL değerleri otomatik atlar.
-- Virgülle ayır
SELECT CONCAT_WS(', ', city, phone, email) AS contact_info FROM customers;
-- "İstanbul, 05551001001, ahmet@email.com"
-- phone NULL ise: "İstanbul, ahmet@email.com" (NULL atlanır!)
-- Adres oluştur
SELECT CONCAT_WS(' - ', city, 'Türkiye') AS address FROM customers;💡 İpucu: NULL olabilecek sütunları birleştirirken
CONCAT_WSkullan,CONCATdeğil.CONCAT_WSNULL'ları otomatik atlar ve ayırıcıyı tekrar etmez.
UPPER ve LOWER — Büyük/Küçük Harf Dönüşümü
-- Tümü büyük harf
SELECT UPPER(first_name) AS upper_name FROM customers;
-- "AHMET", "ZEYNEP", "MEHMET"
-- Tümü küçük harf
SELECT LOWER(email) AS lower_email FROM customers;
-- Zaten küçük olsa bile garanti etmek için
-- E-posta normalleştirme
SELECT * FROM customers WHERE LOWER(email) = LOWER('AHMET@EMAIL.COM');
-- Ürün adı büyük harfle göster
SELECT UPPER(product_name) AS product, price FROM products;⚠️ Dikkat: Türkçe I/İ dönüşümü sorunlu olabilir: -
UPPER('istanbul')→ collation'a bağlı olarak 'ISTANBUL' veya 'İSTANBUL' -utf8mb4_turkish_cicollation'da doğru çalışır -utf8mb4_unicode_ci'da 'i' → 'I' olur ('İ' değil)
LENGTH, CHAR_LENGTH — Uzunluk Ölçme
-- CHAR_LENGTH: Karakter sayısı (önerilen)
SELECT product_name, CHAR_LENGTH(product_name) AS char_count FROM products;
-- "MacBook Pro 14"" → 15
-- LENGTH: Byte sayısı (dikkat!)
SELECT product_name, LENGTH(product_name) AS byte_count FROM products;
-- Türkçe karakterler (ş, ç, ğ) UTF-8'de 2 byte kaplar
-- Fark:
SELECT LENGTH('Türkçe'), CHAR_LENGTH('Türkçe');
-- LENGTH: 8 (T=1, ü=2, r=1, k=1, ç=2, e=1)
-- CHAR_LENGTH: 6 (6 karakter)💡 İpucu: Karakter sayısını ölçmek istiyorsan her zaman
CHAR_LENGTHkullan.LENGTHbyte sayısı verir ve UTF-8 multibyte karakterlerde yanıltıcı olur.
-- 50 karakterden uzun ürün adları
SELECT product_name FROM products WHERE CHAR_LENGTH(product_name) > 50;
-- Kısa e-posta adresleri (şüpheli olabilir)
SELECT email FROM customers WHERE CHAR_LENGTH(email) < 10;SUBSTRING (SUBSTR) — Metin Kesme
-- Belirli pozisyondan başlayarak kes
SUBSTRING(metin, başlangıç_pozisyonu, uzunluk)
-- İlk 3 karakter
SELECT SUBSTRING('Merhaba Dünya', 1, 3); -- "Mer"
-- 5. karakterden itibaren
SELECT SUBSTRING('Merhaba Dünya', 5); -- "aba Dünya"
-- E-posta domain'ini çıkar
SELECT email,
SUBSTRING(email, LOCATE('@', email) + 1) AS domain
FROM customers;
-- "email.com", "email.com", ...
-- Ürün kodunun ilk 3 harfi
SELECT product_name, SUBSTRING(product_name, 1, 3) AS code FROM products;LEFT ve RIGHT — Baştan/Sondan Kes
-- İlk 5 karakter
SELECT LEFT(product_name, 5) FROM products;
-- "MacBo", "iPhon", "Samsu"
-- Son 5 karakter
SELECT RIGHT(email, 5) FROM customers;
-- "l.com", "l.com"
-- Maskeleme (gizlilik)
SELECT CONCAT(LEFT(email, 3), '***@***', RIGHT(email, 4)) AS masked_email
FROM customers;
-- "ahm***@***.com"
-- Telefon numarası maskeleme
SELECT CONCAT('****', RIGHT(phone, 4)) AS masked_phone
FROM customers WHERE phone IS NOT NULL;
-- "****1001"TRIM, LTRIM, RTRIM — Boşluk Temizleme
-- Baş ve sondaki boşlukları temizle
SELECT TRIM(' Merhaba '); -- "Merhaba"
SELECT LTRIM(' Merhaba '); -- "Merhaba " (sadece sol)
SELECT RTRIM(' Merhaba '); -- " Merhaba" (sadece sağ)
-- Belirli karakteri temizle
SELECT TRIM(BOTH '-' FROM '---Merhaba---'); -- "Merhaba"
SELECT TRIM(LEADING '0' FROM '000123'); -- "123"
SELECT TRIM(TRAILING '.' FROM 'test...'); -- "test"
-- Veri temizleme
UPDATE customers SET first_name = TRIM(first_name);
UPDATE customers SET email = LOWER(TRIM(email));💡 İpucu: Kullanıcı girişlerinde boşluk sorunu çok yaygındır. Veri eklerken TRIM uygulamak iyi pratiktir:
INSERT INTO customers (email) VALUES (TRIM(LOWER(' User@Email.COM '))).
REPLACE — Metin Değiştirme
-- Belirli bir metni başka metinle değiştir
SELECT REPLACE('Merhaba Dünya', 'Dünya', 'SQL'); -- "Merhaba SQL"
-- Ürün adındaki tırnak işaretini temizle
SELECT REPLACE(product_name, '"', '') AS clean_name FROM products;
-- Telefon numarasını formatla
SELECT REPLACE(REPLACE(phone, ' ', ''), '-', '') AS clean_phone
FROM customers;
-- Toplu veri düzeltme
UPDATE products
SET product_name = REPLACE(product_name, ' ', ' ') -- Çift boşluğu tek boşluk yap
WHERE product_name LIKE '% %';Diğer Kullanışlı String Fonksiyonları
LOCATE / INSTR — Pozisyon Bulma
-- '@' karakterinin pozisyonu
SELECT email, LOCATE('@', email) AS at_position FROM customers;
-- ahmet@email.com → 6
-- Ürün adında "Pro" nerede?
SELECT product_name, LOCATE('Pro', product_name) AS pro_pos
FROM products WHERE product_name LIKE '%Pro%';REVERSE — Ters Çevirme
SELECT REVERSE('Merhaba'); -- "abaherM"REPEAT — Tekrarlama
SELECT REPEAT('*', 5); -- "*****"
-- Yıldızlı rating gösterimi
SELECT product_name, REPEAT('★', ROUND(rating)) AS stars FROM products;LPAD, RPAD — Doldurma
-- Soldan sıfır doldurma (sipariş numarası formatı)
SELECT LPAD(order_id, 8, '0') AS order_number FROM orders;
-- "00000001", "00000002", ...
-- Sağdan boşluk doldurma
SELECT RPAD(product_name, 30, '.') AS formatted FROM products;
-- "MacBook Pro 14"............."Gerçek Dünya Örneği — Veri Temizleme ve Formatlama
-- Müşteri verisi temizleme ve formatlama raporu
SELECT
customer_id,
-- Ad-soyad düzgün format: ilk harf büyük, geri kalanı küçük
CONCAT(
UPPER(LEFT(TRIM(first_name), 1)),
LOWER(SUBSTRING(TRIM(first_name), 2))
) AS formatted_first_name,
-- E-posta normalleştirme
LOWER(TRIM(email)) AS clean_email,
-- Telefon maskeleme
CASE
WHEN phone IS NOT NULL
THEN CONCAT(LEFT(phone, 4), '***', RIGHT(phone, 2))
ELSE 'Yok'
END AS masked_phone,
-- Şehir bilgisi
COALESCE(UPPER(city), 'BELİRTİLMEMİŞ') AS city
FROM customers;Sıkça Yapılan Hatalar
CONCAT'te NULL tuzağı:
CONCAT('a', NULL)= NULL.CONCAT_WSveyaCOALESCEkullan.LENGTH vs CHAR_LENGTH karışıklığı: UTF-8'de Türkçe karakterler 2 byte. Karakter sayısı için
CHAR_LENGTHkullan.UPPER/LOWER Türkçe sorunu: Collation'a bağlı.
utf8mb4_turkish_ciTürkçe I/İ dönüşümünü doğru yapar.SUBSTRING pozisyonu 1'den başlar: SQL'de string pozisyonu 1'den başlar, 0'dan değil (çoğu programlama dilinden farklı).
LIKE yerine string fonksiyonu kullanmak:
WHERE SUBSTRING(name, 1, 3) = 'Mac'yavaştır (index kullanamaz).WHERE name LIKE 'Mac%'çok daha hızlıdır.
Özet
CONCAT/CONCAT_WS— metin birleştirme (WS versiyonu NULL-safe)UPPER/LOWER— büyük/küçük harf dönüşümüCHAR_LENGTH— karakter sayısı (UTF-8 için doğru),LENGTH— byte sayısıSUBSTRING/LEFT/RIGHT— metin kesmeTRIM/LTRIM/RTRIM— boşluk temizlemeREPLACE— metin değiştirmeLOCATE— metin içinde pozisyon bulmaLPAD/RPAD— doldurma (sıfır ekleme, formatlama)String fonksiyonlarını WHERE'de kullanmak index'i devre dışı bırakır — dikkatli kullan
AI Asistan
Sorularını yanıtlamaya hazır