2010-04-11 4 views
4

I 수정 UTF-8 캐릭터 세트를 가지고 있으며, PHP 양식을 통해 그것을 삽입을 시도시 MySQL의 테이블이 데이터베이스는 다음과 같은 오류 제공했습니다 :UTF-8 데이터베이스 문제

PDOStatement::execute(): SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xE8' for column ...

문자의를 질문은 'è'이지만 데이터베이스와 테이블이 UTF-8로 설정된 것을 고려하면 이것이 왜 문제가되는지 알지 못합니다. 내가 MySQL의 터미널에서 직접 시도와 같은 문제가 한

편집.

+0

쿼리를 만들기 전에 mysql_query ('SET NAMES UTF-8')을 사용해 보셨습니까? – Tom

+0

예 (UTF-8 btw가 아닌 ​​UTF8입니다.) – Danten

+0

아래에 의견에 대한 또 다른 아이디어가 있습니다. 양식을 보내는 데 사용 된 문자 집합이 UTF-8 (클라이언트 측, XML 인코딩으로 설정되었는지 확인했는지 확인 했습니까? 또는 헤더/메타 속성 및

)에 의해 적용될 수도 있습니다. PHP는 내부적으로 (php.ini) UTF-8을 사용하거나 사용하지 않을 수도 있지만, 일부 서버에서는 해당 문자 세트를 동적으로 변경할 수 없습니다. PHP가 8 비트 문자 세트를 사용한다면 UTF-8로 인코딩 된 텍스트를 데이터베이스로 전달해야합니다 (데이터베이스 문자 집합에 따라 mysql_real_escape_string이 작동 함). 그러나 PHP는 문자열 조작시 utf8_decode/utf8_encode가 필요할 수 있습니다. – Energiequant

답변

1

E8은 1 바이트 UTF8 문자의 최대 사용 가능한 문자 7 층보다 큰 : http://en.wikipedia.org/wiki/UTF-8

그것은 당신의 연결이 UTF8하지만 ISO 라틴어와 같은 다른 8 비트 인코딩으로 설정되어 있지 않은 것 같다. 데이터베이스를 UTF8로 설정하면 데이터베이스가 내부적으로 사용하는 문자 집합 만 변경되므로 데이터베이스에 연결 한 후 초기 기본값 인 SET CHARACTER SET utf-8을 보내야하므로 다른 기본값 (latin1은 이전 MySQL 버전)에 연결될 수 있습니다. my.cnf에 대한 액세스 권한이있는 경우 올바른 기본값을 설정할 수도 있지만 기본값을 변경하면 동일한 호스트에서 실행되는 다른 사이트/앱이 손상 될 수 있습니다.

+1

감사합니다, 문제는 PHP의 utf8_encode() 함수를 사용하여 극복했다. – Danten

+0

'SET CHARACTER SET'은 이것에 대한 올바른 명령이 아닙니다. (http://stackoverflow.com/questions/1566602/is-set-character-set-utf8-necessary 참조),'utf8'이어야합니다. 'utf-8'. @Danten, 모든 것을 올바르게 설정했다면'utf8_encode()'를 사용할 필요가 없습니다. – mercator

+0

어떤 이유로 든 SET NAMES는 일부 클라이언트 서버에서 필요로하는 방식으로 작동하지 않았습니다 (일부 서버에서는 전혀 효과가없는 것 같았습니다).문자 세트의 이름 지정은 불행히도 사용하는 배포판에 따라 다릅니다. utf-8은 우리가 배포 한 모든 서버에서 사용할 수 있었지만 utf8은 알 수없는 경우가있었습니다. 그러나 일부 이상하게 호스팅 된 웹 공간을 지원해야하기 때문에 일부 웹 사이트가 잘못된 설정을했을 수 있습니다. 어쨌든 배포시에 신속하게 변경해야하는 경우 적어도 문자 집합 (및 아마도 명령 자체)을 구성 파일에 보관하는 것이 가장 좋습니다. – Energiequant

2

데이터베이스가 UTF-8로 설정되었지만 데이터베이스 연결도 UTF-8로 설정되어야합니다. SET NAMES utf8 문을 사용해야합니다. 당신은 즉시 연결로 그 실행하도록 PDO의 driver_options를 사용할 수 있습니다

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

확실히 전체 사이트를 만들기에 대한 자세한 내용은 다음 두 링크에서보세요 UTF-8 적절하게 사용

+0

나중에 참조 할 수 있도록이 작업을 수행했습니다. 문제는 멀티 바이트 문자열입니다. – Danten

1

당신이 사용할 수 MySQL의에 값을 전달하기 전에 다음 코드를

$val = mb_check_encoding($val, 'UTF-8') ? $val : utf8_encode($val);

문자열을 변환하려면 UTF-8, 그것은 문제의 하나 개의 필드의 경우.

+0

당신은 분명히 그렇게하지 말아야합니다! 인코딩이 무엇인지 확인하고 항상 정확하지는 않습니다. 인코딩이 실제로 다른 방법으로 무엇인지 알아보십시오 (실마리가 없으면 불행하지 않은 경우가 종종 있습니다.). – JeromeJ

+0

네, 맞습니다. 언급 된 것은 문제를 해결하는 빠른 수정입니다. MySQL을 사용하여 문제를 해결해야합니다. – purab