MySQL harmanlama türü PHP sayfa charset türüyle eşleşmesi gerekiyor mu?

4 Cevap php

Ben bunun içinde (yani eksik karakter glif) bazı garip karakterler var çünkü benim RSS beslemesi ayıklama başladı. Ben iki mükemmel acemi kaynakları ile başladı:

Kullanıcılar kopyası vardır ve sitede bir textarea içine MS Word belgeleri pasteing ve PHP sayfaları "özel ile bağdaşmaz" iso-8859-1 "charset kullanarak çünkü ben bizim RSS beslemesi sorunlarınız inanıyorum nedeni, Windows- bullet puan ve MS Word tarafından kullanılan akıllı tırnaklar gibi şeyler için 1252 "kodlamalar.

Yani sorunu gidermek için umuyorum, yapmam gerekir tüm "utf-8" kullanıcı girişi vermek / almak sayfalarında kullanmaya başlamak olduğunu?. Yani HEAD bölümünde aşağıdakileri ayarlayın:

<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />

Benim kullanıcı girişi saklamak benim DB alanları "latin1_swedish_ci" vardır çünkü olsa bu soru sordum gerçek nedeni, ve ben onlara "{[(1) dönüştürmek için ihtiyacınız olup olmadığını bilmek istiyorum "}]? MySQL gerçekten charset yapar bu umurunda değil? Bu sadece bayt bir sürü görür ve Latince gibi harmanlanmış bir alana Unicode koyarsanız yine doğru Unicode olarak geri geleceğiz? Alan diğer alanlar da (ilgili metin büyük miktarda olduğu zaman küçük bir iş olan) dizin bırakarak ve onu yeniden anlamına gelen harmanlama değişen gereken bir FULLTEXT indeksi parçası olduğundan alanını değiştirme yorucu olacaktır.

4 Cevap

Benim kullanıcı girişi saklamak benim DB alanlar "latin1_swedish_ci" vardır ve ben için "utf8_general_ci" onları dönüştürmek için ihtiyacınız olup olmadığını bilmek istiyorum, çünkü ben bile bu soru sordum gerçek nedeni nedir?

Değil charsets - Hayır latin1_swedish_ci ve utf8_general_ci alfabe vardır. Harmanlama karakter saklanır veya bu şekilde giriş / çıkış etkilemez. Sadece sıralama işlevleri kendi sonuçlarını sipariş nasıl denetler. Harmanlama - beklendiği gibi çalışması için - depolama charset eşleşmesi gerekir. Tablolarınızın utf8 saklanır Yani, bir utf8 harmanlama kullanmalısınız.

Mysql için depolama charset doğrudan php charset bağlı değildir. Php iso-8859-1 kullanırken, MySQL için depolama characterSet olarak utf8 kullanabilirsiniz. Bu durumda, bağlantı charset ayarlayarak, bu konuda Mysql anlatmak gerekir (set names XXX). Gerektiği gibi mysql sonra çevirecektir. Eğer MySQL ve PHP üzerinde aynı charset kullanmak istemiyorsanız, size en düşük dommon paydası charset kapasitesi ile bitireceğiz, böylece dizeleri utf8 saklanır olsa bile, karakterlerin tam unicode aralığı yok olacak kullanılabilir. Bu nedenle both MySQL ve PHP de utf8 kullanmalısınız.

Hayır - kesin değil. MySQL anında başka içine ayarlanmış bir karakter dizeleri dönüştürme yeteneğine posseses gibi, MySQL sunucu istemci tarafında çalışıyoruz ne karakter seti biliyor olsa önemlidir (istemci tarafı = PHP komut dosyası, {[(0) }] web sayfanızı erişen istemci). Bu sorgu yayımlayarak yapılabilir

SET NAMES 'utf8';

önce başka bir sorgu için sunucuya göndermek. MySQL sonra istemci karakter uygun dönüşümleri masa ve / veya sütun karakteri ayarlanır ve tüm yolu geri içine koymak iç MySQL karakter haline kurarım olacaktır. Yani genellikle sadece doğru istemci karakter kümesini ayarlama hakkında endişelenmenize gerek. Bu karakter kümesi webserver çıkış için verileri kullanmak karakter setini eşleşmesi gerekir.

MySQL kılavuzuna bir göz atın:

HTTP karakter kodlaması Content-Type başlık alanındaki charset parametresi tarafından beyan edilir of the HTTP response. Other declaration are overwritten by the declaration in the HTTP header:

Bir belgenin karakter kodlamasını (en yüksek öncelik en düşüğe) belirlerken [...] kullanıcı arayüzlerinin aşağıdaki öncelikleri gözlemek gerekir:

  1. Bir HTTP "Content-Type" alanında "charset" parametresi.
  2. A META beyanı "http-equiv" "Content-Type" olarak ayarlanır ve "charset" için ayarlanan bir değerdir.
  3. charset özellik, harici bir kaynak ataması bir öğe ayarlanır.

Ayrıca açıkça accept-charset niteliği in the form elemanı ile kabul edilen karakter kodlamasını beyan etmelidir. Aksi takdirde kullanıcı aracısı almak (ama must) giriş verileri kodlamak için form belgede kullanılan karakter kodlaması olabilir:

Bu özellik için varsayılan değer saklıdır dize "BİLİNMEYEN" dir. Kullanıcı arayüzleri bu FORM elementi içeren belgeyi iletmek için kullanılan karakter kodlaması olarak bu değeri yorumlayabilir.

Bu size gelen veri doğru biçimde kodlanmış olduğunu iyi şans vermek gerekir. Ama Guarateed değil. Veri acutally UTF-8 ile kodlanmış Yani daha iyi (bunu yapmak için fonksiyonlar / algoritmalar vardır) kontrol edin.

Mysql bağlantı PDO / mysql ile güzel charset değiştirmek için nasıl ararken birisi biraz zaman kazanmak için burada ben bunu nasıl:

$dbc = new pdo('mysql:dbname=DBNAME;host=DBHOST', $user, $pw, array(PDO::MYSQL_ATTR_INIT_COMMAND => sprintf( "SET NAMES %s", $charset ) ) );