2010-12-16 2 views
14

좋아, 현재 PHP/MySQL/UTF-8/유니 코드 지옥에있어!UTF8은 PHP -> MySQL을 발행합니다. 데이터베이스에 물음표가 표시됩니까?

내 환경 : 의 MySQL : 5.1.53 서버 characterset : 라틴 DB의 characterset : 라틴 클라이언트 characterset :. 라틴 코네티컷 characterset : 5.3.3

내 PHP 파일 :

PHP 라틴 ASCII 파일이 아닌 UTF-8 형식으로 저장됩니다. 내 PHP 코드에서

내가 할 데이터베이스 연결은 다음합니다

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

형식은/내 MySQL 데이터베이스의 생성은 다음과 같습니다

하지가 app_languages을 존재하는 경우 테이블 만들기 ( language_id int (10) 부호없는 NOT NULL, app_id int (10) 부호 없음 NOT NULL, description tinytext collate utf8_unicode_ci, PRIMARY KEY (language_id, app_id) ) ENGINE = MyISAM DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci;

내 PHP 코드에서 생성 된 SQL 문

는 다음과 같다 :

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

내가 잘못 뭐하는 거지 :

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

그러나, 출력이로 내 데이터베이스에 나타납니다 ??

P. 우리는 SSH에 퍼티를 데이터베이스 서버에 직접 사용하고 커맨드 라인을 통해 유니 코드/다국어 삽입 문장 중 하나를 붙여 넣을 수 있습니다. 그리고 그들은 성공적으로 작동합니다!?

어떤 빛을 주셔서 감사합니다.

건배, 제이슨

답변

1

대답은 귀하의 질문에 권리입니다. 데이터베이스 전체에서 latin1을 사용하고 있으며 유니 코드를 처리 할 수 ​​없습니다. UTF-8로 변경해야합니다.

+0

내 의견에 표시됩니다. "PS 아닙니다. 데이터베이스 서버와 명령 줄을 통해 직접 SSH에 퍼티를 사용할 수 있습니다. 유니 코드/다국어 삽입 명령문 중 하나를 붙여 넣습니다. !? " – Jason

+0

@ Jason 퍼티가 올바른 인코딩을 사용하고 있습니까? http://thegreyblog.blogspot.com/2009/08/configuring-putty-to-use-utf-8.html – bobo

+0

@bobo, 맞습니다. 정확히 퍼티가 인코딩을 처리하는 방법입니다. UTF-8입니다. – Jason

13

당신이 DB를 선택한 후 다음 쿼리를 실행하려고 :

SET NAMES 'utf8' 

이 쿼리 파일과 DB를 다른 캐릭터 세트와 함께 문제를 해결해야한다. 당신은 이미 당신이 다루고있는 것을 알지 못한다면

펠릭스

+1

고마워요. 당신의 대답이 내 심각한 문제를 해결했습니다. –

+0

좋은 답변입니다. 나는 똑같은 문제를 가지고 있었고, 그것은 내 문제를 해결했다. 고마워. – ako

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

mb_detect_encoding 꽤 쓸모가있다. 두 번째와 세 번째 인수를 지정하지 않으면이 함수에 의존해서는 안됩니다. 현재는 아마 당신이 생각하는 것을 반환하지 않을 것입니다.

0

나는 당신이 그것을 보았다는 단어가 ???????임을 알 수 있습니다.이 문제가 해결 될 수, 데이터 정렬

cp1256_general_ci 

하지

UTF-8_general_ci 

변화가 있어야한다.