2010-12-16 14 views
14

OK, jestem obecnie w piekle PHP/MySQL/UTF-8/Unicode!Problemy z UTF8 PHP -> MySQL. Uzyskiwanie znaków zapytania w bazie danych?

Moja okolica: MySQL: 5.1.53 Server CharacterSet: latin1 Db CharacterSet: latin1 CharacterSet Client. Latin1 Conn CharacterSet: latin1

PHP: 5.3.3

Moje pliki PHP są zapisywane w formacie UTF-8, a nie w plikach ASCII.

W moim kodu PHP, kiedy zrobić połączenie z bazą danych I wykonaj następujące czynności:

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) 
); 

Format/tworzyć z mojej bazy danych MySQL:

CREATE TABLE IF NOT EXISTS app_languages ( language_id int (10) unsigned NOT NULL, app_id int (10) unsigned NOT NULL, description koniczyny tinytext utf8_unicode_ci, PRIMARY KLUCZ (language_id, app_id) ) SILNIK = USTAWIENIA CHARAKTERU MYSZY = UTF8 COLLATE = utf8_unicode_ci;

instrukcje SQL, które są generowane z mojego kodu PHP wyglądać tak:

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, "アラビア語のスポーツニュースと情報") 

Jednak wyjście pojawia się w mojej bazy danych, jak ten:

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

Co robię źle ??

P.S. Możemy użyć Putty do SSH bezpośrednio do serwera bazy danych i poprzez wiersz polecenia Wklej jedną z instrukcji Unicode/Multi-Lingual. I działają z powodzeniem !?

Dzięki za światło, które można rzucić na to, doprowadza mnie do szału.

Pozdrawiam, Jason

Odpowiedz

1

Odpowiedź jest właściwa w pytaniu. Używasz latin1 w bazie danych i nie możesz obsłużyć Unicode. Trzeba je również zmienić na UTF-8.

+0

Nie, to nie jest poprawne, ponieważ zobaczysz w moich komentarzach "PS Możemy użyć Putty do SSH bezpośrednio do serwera bazy danych i poprzez wiersz polecenia Wkleić jedną z instrukcji Unicode/Multi-Lingual. !? " – Jason

+0

@Jason Czy jesteś pewien, że Putty używa właściwego kodowania? http://thegreyblog.blogspot.com/2009/08/configuring-putty-to-use-utf-8.html – bobo

+0

@bobo, tak to dokładnie w jaki sposób Putty obsługuje kodowanie, to jest UTF-8. – Jason

13

spróbuj wykonać następujące zapytanie po wybraniu db:

SET NAMES 'utf8' 

zapytanie to powinno rozwiązać problem z różnymi zestawami znaków w plikach i db.

Felix

+1

Wielkie dzięki. Twoja odpowiedź rozwiązała mój poważny problem. –

+0

Dobra odpowiedź. Miałem ten sam problem, więc rozwiązał mój problem. wielkie dzięki – ako

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

mb_detect_encoding jest zupełnie bezużyteczne, chyba już wiesz, co masz do czynienia. Prawdopodobnie nie powinieneś polegać na nim, chyba że podasz drugi i trzeci argument. Obecnie prawdopodobnie nie zwraca tego, co myślisz, że robi.

0

Widzę, że słowa, które zobaczyłeś jako ??????? są arabskimi słowami ...który musi mieć sortowania

cp1256_general_ci 

nie

UTF-8_general_ci 

zmiana, która może rozwiązać ten problem.

Powiązane problemy