Kodları lütfen aşağıdaki butonları kullanarak renklendirin. Örnek: <php> echo "Selam Dünya"; </php>
Yardım
karakter kaldı

UTF8 ve multibyte karakter sorunsalı (PHP ve MySQL)

Arkadaşlar,

UTF8'de bazı karakterler 2 veya 3 byte yer tutabiliyor. Bu durumda varchar(20) olarak yapacağım bir MySQL sahası tanımında tutulacak karakter sayısı ne olur?

Ayrıca, UTF8 tanımlı tablolarda SELECT işlemi yaparken strlen, substr vb string fonksiyonları nasıl kullanmak gerekiyor?

Aynı şekilde, MySQL'den gelen bu sonuçları PHP'de kullanırken strlen, substr vb string fonksiyonları nasıl kullanmak gerekiyor?
+0
-0
Cevaba KatılıyorumKatılmıyorum
Cevap Yaz Yorum Yaz Arşivime Ekle Takip Et

Doğru Cevap

  • fka adlı üyenin fotoğrafı
    10 yıl önce yazılmış
    70 cevap - 0 soru
    varchar(20) yaptığında 20 karakterlik veri tutulur fakat kırpılır. diyelim ki varchar(3) olan bir kolonun var buraya "aşb" yazarsan "aş" olarak insert olur, fakat "abş" yazarsan "ab?" şeklinde ş harfinin yarısını alır.

    Gelen data ile substr gibi fonksiyonları kullanırken ise mb_ fonksiyonlarını kullanmalısın. config veya bootstrap'ta mb_internal_encoding('UTF-8'); dedikten sonra substr yerine mb_substr kullanarak multibyte karakterleri bozmadan alabilirsin.

    ikinci soruna gelince

    select *,substring(username from 1 for 4) as username from users;

    gibi bir kullanım multibyte karakterleri ortadan ayırabiliyor. sanırım bunun için yapılmış bir geliştirme yok.

    http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_substr

    burada multibyte-safe denilmiş fakat, yaptığım testler öyle göstermiyor malesef.

    http://bugs.mysql.com/bug.php?id=31242
    • madpoet adlı üyenin fotoğrafı madpoet
      Bir yerde yanlışınız var ama nerde... Her connection'ın başında "set names utf8" komutu verirseniz düzgün çalışması lazım yani varchar(20)'ye tam 20 karakter sığar...

      Şimdi substring'i de denedim o da düzgün çalışıyor... Zaten çalışmasa mutlaka daha önce dikkatimi çekerdi.

      Acaba alanın collation'ı etkiler mi diye denediğim alanı latin5_turkish_ci yaptım yine düzgün çalıştı (ki beklediğim de oydu, set names komutu onu hallediyor olmalı)

      Şurada mysql collation'ları ile ilgili detaylı açıklama var:

      http://www.huysuzadam.com/2009/05/23/mysql-turkce-destegi-collation-ve-character-set-nedir/
      10 yıl önce yazılmış
    • fka adlı üyenin fotoğrafı fka
      veriyorum ama çalışmadı, belki de direk mysql konsoldan çalıştırdığım için olabilir :) yoksa set names utf8; önerisini yapacaktım, fakat konsoldan çalışmadığı için önermedim :)

      username'e fkş adında bir değer verip 3 karakter çektiğimde ş karakterini ikiye bölüyordu. varchar(3)'e insert ettiğimde ise yine bölerek insert ediyordu.
      10 yıl önce yazılmış
    • madpoet adlı üyenin fotoğrafı madpoet
      set names utf8 konsolda da çalışır yaw :)
      Ubuntuda denedim şimdi set names utf8 olursa çalışıyor, set names latin5 olursa bölüyor ama latin5 olursa utf8 karakterleri zaten hiç göstermiyor. Yani bölmek değil select edince ? işareti falan gösteriyor...
      10 yıl önce yazılmış
    • fka adlı üyenin fotoğrafı fka
      evet sorunu çözdüm, insert yaparken set names utf8 yapmazsan, fakat çekerken set names utf8 yaparsan da patlıyormuş, ben insert ederken set names utf8 yapmıyordum, fakat çekmeden önce yapıyordum :)

      kısacası çözüm "set names utf8" miş :)

      testleri düzgün yapmak gerekiyormuş, bir şeyi daha öğrenmiş oldum :)
      10 yıl önce yazılmış
    • curlyhair adlı üyenin fotoğrafı curlyhair
      Hep karşılanşılan bir soruna değinmişsiniz arkadaşlar tşk ederim.
      10 yıl önce yazılmış

Cevaplar

  • Vedia adlı üyenin fotoğrafı
    10 yıl önce yazılmış
    66 cevap - 21 soru
    Arkadaşlar,

    UTF8'e geçiş konusunu araştırırken aşağıdaki yazı ile karşılaştım.

    http://stackoverflow.com/questions/279170/utf-8-all-the-way-through

    Bu sayfadaki bilgiler çok faydalı olduğu için sizlerle de paylaşmak istedim.

    Vakit bulduğum bir ara bu yazının türkçe çevirisini yapıp burada yayınlamayı düşünüyorum.
  • uralozden adlı üyenin fotoğrafı
    10 yıl önce yazılmış
    70 cevap - 0 soru
    varchar maxiumum değeri 64kb dır yani 65535 karaktere kadar sonuç verebilir bundan sonrası için text veya long text yazmanı tavsiye ederim yapacağın yazılım nedir bilemiyorum ama sonuçta NaSA ya program yazmıyorsundur veritabanının varchar yada text olması sistemini çok yavaşlatmaz.

    strlen,substr fonksiyonları da select işlemi yaparken değil echo yaptırırken kullanmanı öneririm. Bu sayede çekilden veri tam olarak çekilir sadece yazdırma kısmında görüntüsünü değiştirisin


    Ör:

    $deneme = 'yazilandenemeyazisi'
    $a = substr($deneme, 3,-2);
    echo ('$a');
    Şekilnde uygulandığında ekran çıktısı

    "ilandenemeyazi "

    Şeklinde olacaktır yani baştan 3 karanter sonran da 2 karakter silecektir.