PHP ve MySQL 5.2.10 5.0.81 bozuk UTF-8 Karakterler

5 Cevap php

Biz yerel kalkınma sunucu ve canlı bir sitede hem de barındırılan bir uygulama var. Biz UTF-8 yolsuzluk sorunları yaşıyor ve bunları çözmek için nasıl anlamaya arıyoruz.

Sistem uskur ile Symfony 1.0 kullanılarak çalıştırılır.

Geliştirme sunucusunda, biz PHP 5.2.0 ve MySQL 5.0.32 yayınlanıyor. Biz orada bozuk UTF-8 karakterleri deneyimi yok.

Bizim canlı sitede, PHP ve MySQL 5.2.10 5.0.81 çalışıyor. Bu sunucu üzerinde, örneğin ố ve veritabanında saklanan bir kez Σ bozuk gibi bazı karakterler. Bozuk karakterler bitişik soru işaretleri ile özgün karakteri soru işareti veya yaklaşımları ya olarak gösteriyorlar.

Yolsuzluk örnekleri:

Uncorrupted: ố Corrupted: ô?

Uncorrupted: Σ Corrupted: ?

Şu anda geliştirme ve canlı sunucular üzerinde aşağıdaki teknikleri kullanıyor:

  1. Önce başka sorguları yürütme aşağıdaki sorguları yürütme:

    SET NAMES 'utf8' COLLATE 'utf8_unicode_ci'
    SET CHARSET 'utf8'
    
  2. : Için <meta> Content-Type değerini ayarlama

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    
  3. . Bizim htaccess dosyasına aşağıdaki ekleme:

    AddDefaultCharset utf-8
    
  4. Kullanımı mb_* (multibyte) PHP fonksiyonları gerektiğinde.

  5. Harmanlama utf8_unicode_ci kullanmak veritabanı sütunları ayarlamak için emin olmak.

    Bu teknikler bizim geliştirme sitesi için yeterli, ancak canlı sitede çalışmaz.

Canlı sitede ben de mysql_set_encoding('ut8', $mysql_connection) ekleyerek denedim ama bu da yardımcı olmuyor. PHP ve MySQL yeni sürümleri UTF-8 karakter kodlamaları ilgilenmedikleri olduğunu bazı kanıtlar bulduk.

5 Cevap

Bizim deneyimli bir sistem yöneticisi bir düzeltme keşfetti:

alter database DB_NAME character set utf8;

Bu tamamen bizim sorunlar çözüldü.

Az örnek alın - sadece bir Σ karakter demek ile bir formu göndermek ve yolda tarayıcıdan veritabanına bozuk ediliyor yalıtmak. Eğer veritabanına elle kapalı, ve başka bir yerde şüpheli önce son şey bir olabilir, istek tarayıcıdan alınan kısa sürede sonra, PHP uygulaması bir günlüğüne bin2hex ($ str) değerini yazdırmak sorun alanı - Σ için yazdırmak gerekir cea3. Veritabanında, kaydedilmiş veriler üzerinde çalışacak charset (col), onaltılık (col) - tüm çalışıyor eğer [, "cea3" "utf8"] yazdırmak gerekir (tablolar utf8 olduğunu varsayarak).

Eğer how karakterleri bozuk hakkında olabilir net - onlar da boş görünüyor? mojibake olarak? boş "tofu" kutuları? dize sorun karakteri kesildi? beklenen ve gözlenen bayt temsilleri nelerdir? - Bunu neden olabilir ne var olacak daha fazla ipucu.

Eğer Doktrini veya Propel kullanıyorsanız mysql_set_encoding() hem Orms PDO (uskur <1.3 tabanlı Creole / Mysqli olduğu) dayalı olarak hiçbir etkiye sahip oluyor unutmayın.

Ben aynı sorun vardı, ama Doktrin DB harmanlama tablolar ve UTF-8 bağlantı, her şeyin halledilir çünkü MySQL değildi.

I substr() umlauts (ü) ile sorunların neden olduğu bulunmuştur yüzden kullanıcı veri girişi için mb_substr(), mb_strlen() vb geçti. Ini ayarı hakkında unutma veya işe yaramaz:

ini_set('mbstring.internal_encoding','UTF-8');

VEYA

mbstring.internal_encoding = UTF-8; //in php.ini