• 18-10-2015, 09:42:58
    #1
    php ve mysql için hangi karakter setini kullanıyorsunuz. Çoğu dillerle uyumlu olması için sanırsam günümüzde;

    utf8_general_ci
    utf8_unicode_ci
    bu ikisinden birini kullanıyorlar?

    bunları da wordpress veritabanında gördüm sanırsam. utf8mb4 nedir? yeni birşey galiba?
    utf8mb4_general_ci
    utf8mb4_unicode_ci

    utf8_general_ci daha hızlı diyorlar. tabi az bir hız farkı var diyorlar.

    önerileriniz nedir?
  • 18-10-2015, 13:50:47
    #2
    Selamlar,

    Karakter seti ve karakter sıralama seçimi birbirinden farklı şeyler. Seçerken collation yani sıralama seçenekleri seçildiği için ikisinin aynı olduğu yanılgısına kapılabiliyor insanlar.

    Karakter seti olarak kullanacağım yere göre değişiklik gösterse de tercihim çoğunlukla utf8'dir. utf8 ile utf8mb4 arasında şöyle bir fark vardır.
    * utf8 multibyte bir karakter setidir. Yani utf8 bir karakter her zaman 1 byte uzunluğunda olmayabilir. Örneğin "i" 1 byte'lık bir karakter iken "İ" 2 byte uzunluğundadır.
    * utf8 kodlama seti kendi içerisinde 1 ila 4 byte uzunluğundadır. Yani kullandığınız karaktere göre bu karakterin disk üzerinde kapladığı yer değişkenlik gösterir.
    * MySQL içerisindeki utf8 kodlama sistemi 1 ila 3 byte uzunluğundadır. Yani tam olarak utf8'i MySQL desteklemez. 4 byte uzunluğundaki bir utf8 karakteri utf8 olarak seçilmiş kolona koymaya çalışırsanız MySQL hata verecektir.
    * 4 byte uzunluğundaki karakterler için MySQL sonradan kendi içerisine utf8mb4 karakter kodlama setini eklemiştir.

    Sıralama seçimi için de kullanacağınız içeriklerin diline göre tercih yapmanızda fayda var. Türkçe içerik barındıracaksanız eğer turkish_ci seçmenizde fayda var. Yok İngilizce içerik barındıracaksanız general_ci seçebilirsiniz.

    https://dev.mysql.com/doc/refman/5.5...e-utf8mb4.html
    https://en.wikipedia.org/wiki/UTF-8
  • 18-10-2015, 17:09:11
    #3
    evet demek istediğim tam olarak karakter sıralama collation

    collation nedir bunu da araştırmam lazım.

    4 byte uzunluğundaki bir utf8 karakteri utf8 olarak seçilmiş kolona koymaya çalışırsanız MySQL hata verecektir.

    bunu deneyip anlayabilirim sanırsam.

    4 byte lık bir karaktere örnek nedir?
  • 18-10-2015, 17:10:11
    #4
    utf8_general_ci kullanıyorum eskiden latin1-latin5 kullanıyordum
  • 18-10-2015, 22:05:45
    #5
    Misafir adlı üyeden alıntı: mesajı görüntüle
    evet demek istediğim tam olarak karakter sıralama collation

    collation nedir bunu da araştırmam lazım.

    4 byte uzunluğundaki bir utf8 karakteri utf8 olarak seçilmiş kolona koymaya çalışırsanız MySQL hata verecektir.

    bunu deneyip anlayabilirim sanırsam.

    4 byte lık bir karaktere örnek nedir?
    4 byte uzunluğa sahip karakterler daha çok bilim dallarında kullanılan simgeler ve uzakdoğu ve ortadoğu dillerindeki bazı karakterlerdir,

    örneğin ▓ veya 𩸽 veya 㓘ờ veya arapça ﷺ

    ayrıca bu karakterleri mysqle yazmaya çalışırken hata vermek yerine, 4 byte veriyi 3 + 3 yani 6 byte alan kaplayacak şekilde yazar.
  • 18-10-2015, 23:53:06
    #6
    victories adlı üyeden alıntı: mesajı görüntüle
    ayrıca bu karakterleri mysqle yazmaya çalışırken hata vermek yerine, 4 byte veriyi 3 + 3 yani 6 byte alan kaplayacak şekilde yazar.
    İfade hatası olmuş, hata değil uyarı demek daha doğru bir ifade olacak. Verilen uyarı da aşağıdaki gibidir.

    +---------+------+--------------------------------------------------------------------------------------+
    | Level   | Code | Message                                                                              |
    +---------+------+--------------------------------------------------------------------------------------+
    | Warning | 1366 | Incorrect string value: '\xF0\xA5\xB9\x96\xF0\xA5...' for column 'utf8_col' at row 1 |
    +---------+------+--------------------------------------------------------------------------------------+
    4 byte'lık karakterin 3+3 olarak saklanması konusuna gelince, bunu tekrar test ettim ve dev.mysql.com üzerinde 5.0'dan 5.7'ye kadar tek tek kontrol ettim, 5.4 ve 5.5 versiyonlarında test ettim. Dediğiniz gibi 3+3 şeklinde bir saklama söz konusu değil. UTF8 kolona 4 bytelık utf8 karakteri yazılmak istendiğinde haberleşme utf8 ise kolona hiçbir içerik kayıt etmez, uyarı verir, utf8mb4 ise ilgili karakterler '?' ile değiştirilir ve o şekilde kayıt edilir. En altta dev.mysql.com bağlantısından da bu veriye ulaşabilirsiniz.

    CREATE TABLE `test` (
      `utf8_col` varchar(45) CHARACTER SET utf8,
      `utf8mb4_col` varchar(45) CHARACTER SET utf8mb4
    );
    set names utf8;
    insert into test (utf8_col,utf8mb4_col) values ('𥹖𥹖𥹖𥹖','𥹖𥹖𥹖𥹖');
    set names utf8mb4;
    insert into test (utf8_col,utf8mb4_col) values ('𥹖𥹖𥹖𥹖','𥹖𥹖𥹖𥹖');
    Sonuçlar;
    select length(utf8_col),length(utf8mb4_col) from test;
    +------------------+---------------------+
    | length(utf8_col) | length(utf8mb4_col) |
    +------------------+---------------------+
    |                0 |                  16 |
    |                4 |                  16 |
    +------------------+---------------------+
    2 rows in set (0.21 sec)
    select char_length(utf8_col),char_length(utf8mb4_col) from test;
    +-----------------------+--------------------------+
    | char_length(utf8_col) | char_length(utf8mb4_col) |
    +-----------------------+--------------------------+
    |                     0 |                       16 |
    |                     4 |                        4 |
    +-----------------------+--------------------------+
    https://dev.mysql.com/doc/refman/5.7...t-unicode.html
  • 20-10-2015, 21:53:46
    #7
    cevaplar için teşekkür ederim baya derinlere indik konuyla ilgili