2010-12-16 28 views
14

Tamam, şu anda PHP/MySQL/UTF-8/Unicode cehennemdeyim!UTF8, PHP -> MySQL verir. Veritabanında soru işaretleri mi alıyorsunuz?

My çevre: MySQL: 5.1.53 Sunucu karakter takımı: latin1 Db karakter takımı: latin1 Müşteri karakter takımı:. Latin1 Conn karakter takımı: 5.3.3

Benim PHP dosyaları:

PHP latin1 ASCII dosyaları değil, UTF-8 formatı olarak kaydedilir. Benim PHP kodunda

Yapmam veritabanı bağlantısı aşağıdaki yapmak:

ini_set('default_charset', 'utf-8'); 
$my_db = mysql_connect(DEV_DB, DEV_USER, DEV_PASS); 
mysql_select_db(MY_DB); 
// I have tried both of the following utf8 connection functions 
// mysql_query("SET NAMES 'utf8'", $my_db); 
mysql_set_charset('utf8', $my_db); 
// Detect if form value is not UTF-8 
if (mb_detect_encoding($_POST['lang_desc']) == 'UTF-8') { 
$lang_description = $_POST['lang_desc']; 
} else { 
$lang_description = utf8_encode($_POST['lang_desc']); 
} 
$language_sql = sprintf(
'INSERT INTO app_languages (language_id, app_id, description) VALUES (%d, %d, "%s")', 
          intval($lang_data['lang_id']), 
          intval($new_app_id), 
          mysql_real_escape_string($lang_description, $my_db) 
); 

biçimi/benim MySQL veritabanı oluşturmak geçerli:

DEĞİL app_languages VARSA TABLO OLUŞTURMA ( language_id int (10) imzasız NOT NULL, app_id int (10) imzasız NOT NULL, description tinytext harmanlama utf8_unicode_ci, İLK ANAHTAR (language_id, app_id) ) MOTOR = MYISAM DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci;

benim PHP kodundan oluşturulan SQL ifadeleri

şuna benzer:

|   69 | 2055 | ?????????????????        | 
|   56 | 2055 | ?????? ????? ????? ?????      | 
|   28 | 2055 | Arapski sportske vijesti i informacije   | 
|   42 | 2055 | Arabe des nouvelles sportives et d\'information | 
|   91 | 2055 | ??????????          | 

yanlış yapıyorum:

INSERT INTO app_languages (language_id, app_id, description) VALUES (91, 2055, "阿拉伯体育新闻和信息") 
INSERT INTO app_languages (language_id, app_id, description) VALUES (26, 2055, "阿拉伯體育新聞和信息") 
INSERT INTO app_languages (language_id, app_id, description) VALUES (56, 2055, "בערבית ספורט חדשות ומידע") 
INSERT INTO app_languages (language_id, app_id, description) VALUES (69, 2055, "アラビア語のスポーツニュースと情報") 

Oysa çıktı bu benim veritabanında görünür ??

P.S. Putty'yi SSH'ye doğrudan veritabanı sunucusuna ve komut satırından kullanarak unicode/multi-lingual insert ifadelerinden birini yapıştırın. Ve başarılı bir şekilde çalışıyorlar !?

Bunun üzerine dökebileceğiniz herhangi bir ışık için teşekkürler, beni çıldırtıyor.

Alkış, Jason

cevap

1

cevap sorunuzu doğru. Latin1'i veritabanınız boyunca kullanıyorsunuz ve unicode'u kullanamıyor. Bunları UTF-8'e de değiştirmeniz gerekiyor.

+0

Hayır, bu doğru değil çünkü yorumlarımda göreceksiniz "PS SSH'yi doğrudan veritabanı sunucusuna ve komut satırından kullanarak unicode/multi-lingual insert ifadelerinden birini yapıştırın. Ve başarılı bir şekilde çalışıyorlar. !?" – Jason

+0

@Jason Putty'nin doğru kodlamayı kullandığını biliyor musunuz? http://thegreyblog.blogspot.com/2009/08/configuring-putty-to-use-utf-8.html – bobo

+0

@bobo, evet Putty'nin kodlamayı nasıl yürüdüğü tam olarak budur, UTF-8'dir. – Jason

13

Eğer db seçilen sonra aşağıdaki sorguyu çalıştırmayı:

SET NAMES 'utf8' 

bu sorgu dosya ve db farklı chartsets'ten ile sorunu çözmek gerekir. Eğer zaten neyle ilgili olduğunu bilmedikçe

Felix

+1

Çok teşekkürler. Cevabınız benim ciddi sorunumu çözdü. –

+0

iyi cevap. Aynı problemi yaşadım, problemimi çözdüm. çok teşekkürler – ako

0
//first make sure your file produce utf-8 chars 
header('Content-Type: text/html; charset=utf-8'); 
0

mb_detect_encoding oldukça işe yaramaz. İkinci ve üçüncü argümanı belirtmedikçe muhtemelen ona güvenmemelisiniz. Şu anda muhtemelen düşündüğünüzü geri getirmiyor.

0

??????? olarak gördüğünüz kelimelerin Arapça kelimeler olduğunu görüyorum.sorunu çözebilir, bir harmanlama

cp1256_general_ci 

değil

UTF-8_general_ci 

değişiklik olması gereken.