2012-10-05 1 views
6

PHP를 사용하고 MySQL에 넣는 것으로 일부 데이터를 구문 분석합니다. 데이터가 êm-Khê MySQL은 같은 특수 문자가 포함 된 경우 그러나 오류 다음 출력됩니다 : 내가 테스트 후PHP로 특수 문자를 MySQL로 구문 분석하는 방법은 무엇입니까?

SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xEAm-Kh\xEA...' 

는, MySQL은 문제가되지 않습니다. (테이블 및 칼럼 데이터 정렬은 utf8_general_ci입니다.) 테이블에 직접 êm-Khê 문자열을 삽입하면 (직접) 테이블에 입력됩니다. 그래서 MySQL은 그 데이터를 받아 들일 수 있습니다.

그래서 PHP 수준에서이 오류가 발생하는 이유는 무엇입니까?

인코딩 지식에 대해 잘 이해하지 못하고 있습니다.

  • ê이 쿼리에서 \xEA으로 변환 되었습니까?

그래서 ê과 같은 데이터를 얻었을 때 어떻게 데이터베이스에 넣을 수 있습니까? ê은 그대로 유지됩니까?

+1

DB 삽입 –

+1

[웹 응용 프로그램에서 유니 코드 앞면 처리] (http://kunststube.net/frontback/) 코드를 게시 할 수 있습니까? – DCoder

답변

3

그래서 DB 연결은 UTF8이 아니라 LATIN1이 아니므로 PHP의 함수 utf8_encode()을 사용하거나 데이터베이스에 연결 한 후에 SET NAMES utf8을 실행해야합니다.

$handle = new PDO("mysql:host=localhost;dbname=dbname", 
'username', 'password', 
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); 

This thread은 좋은 참조 및 설명

+0

PDO? 미안해, 너 무슨 뜻인지 알지 못해. 나는 mysql_connect를 사용하고있다. 그것은 그렇게되지 않습니다. –

+1

오, 알았어요. php'utf8_encode()'메소드를 사용해서 얻었습니다. 감사 x) –

+0

5.3.6 이후에는 연결 문자열의 일부로'; charset = utf8'을 사용해야합니다. –

0

내 생각에 PHP와 MySQL간에 인코딩 불일치가 있습니다. ê은 실제로 \xEA으로 "변형"되지 않았습니다. MySQL이 바이트 시퀀스 EA이 무엇인지 모르기 때문에 잘못된 바이트에 대해 불만을 토로합니다. PHP에서 문자열의 인코딩이 무엇인지 먼저 알아야합니다. 어디에서 왔는지에 따라 다릅니다. 그런 다음 올바른 MySQL 연결 인코딩을 설정해야합니다. 따라서 MySQL은 보내는 문자열이 어떤 인코딩인지 알고 있습니다. 수행 방법은 데이터베이스에 연결하는 방법에 따라 다릅니다.

전체 프로세스의 개요는 Handling Unicode Front To Back In A Web App을 참조하십시오.

+0

안녕하세요, PHP에서 문자열의 소스 인코딩은'utf-8'이며 XML에서 오는 것입니다. XML은 'utf-8'로 인코딩되어 있습니다. –

+0

그런 다음 데이터베이스로 보내고있는 질의에 대해'bin2hex'를 사용하여 두 번 확인하고 연결 인코딩이 무엇인지 확인하십시오. – deceze

-1
이 기능을 사용할 수 있습니다

있습니다. mysql_real_escape_string ($ user), mysql_real_escape_string ($ password));

관련 문제