2009-11-05 7 views
10

mysql에서 postgresql로 db를 마이그레이션하고 있습니다. mysql db의 기본 데이터 정렬은 UTF8이고 postgres는 또한 UTF8을 사용하며 pg_escape_string()을 사용하여 데이터를 인코딩합니다. 어떤 그러나 이유로, 나는 나쁜 인코딩에 대한 몇 가지 펑키 오류로 실행 해요 :PostgreSQL + PHP + UTF8 = 인코딩을위한 바이트 시퀀스가 ​​올바르지 않습니다.

pg_query() [function.pg-query]: Query failed: ERROR: invalid byte sequence for encoding "UTF8": 0xeb7374 HINT: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client"

내가 주위를 파고 이것을 알아 내기 위해 노력했습니다, 그리고 PHP는 이상한 일을하고있는 것으로 나타났습니다; 문자열에 ascii 문자 만 있으면 (예 : "hello") 인코딩은 ASCII입니다. 문자열에 ASCII 문자가 아닌 문자가 포함되어 있으면 인코딩이 UTF8 (예 : "Hëllo")이라고합니다.

이미 UTF8 인 문자열에 utf8_encode()를 사용하면 특수 문자가 삭제되어 모든 문자가 엉망이됩니다.이 기능을 사용하려면 어떻게해야합니까?

은 BTW

답변

1

(정확한 문자는, 내가 지금이 좀 문제가 다시 발생하지 더 나은 해결책을 찾기 위해 싶지만 대신 교체/검색의 ","바로 지금입니다 끊기) ASCII 문자열은 동일한 처음 127자를 공유하기 때문에 UTF-8에서 정확히 동일합니다. 그래서 ASCII의 "Hello"는 UTF-8의 "Hello"와 정확히 동일합니다. 변환이 필요 없습니다.

표의 데이터 정렬은 UTF-8 일 수 있지만 동일한 인코딩으로 정보를 가져 오지 못할 수 있습니다. 이제 pg_escape_string에 전달하는 정보에 문제가있는 경우 MySQL에서 가져온 내용이 UTF-8로 인코딩되었다고 가정하고 있기 때문에 가능할 것입니다. this page on MySQL documentation을보고 연결 인코딩을 참조하십시오. 당신은 아마도 데이터 정렬이 UTF-8 인 테이블에서 가져온 것이지만 연결은 Latin-1과 같습니다 (çéèêöà 등과 같은 특수 문자는 UTF-8로 인코딩되지 않습니다).

+0

이것으로 몇 시간을 보냈다. 실제로 mysql이 non-utf8 문자열을 db에 허용했다고 생각하기 시작했다. 문제의 원인은 .. – Ian

6

대부분의 경우 MySQL 데이터베이스의 데이터는 UTF8이 아닙니다. 꽤 일반적인 시나리오입니다. MySQL은 적어도 데이터에 대한 유효성 검사를 전혀하지 않았기 때문에 클라이언트가 UTF8이라고 주장하는 한 UTF8로 던진 모든 것을 허용했습니다. 그들은 지금까지 그것을 고쳤을 수도 있습니다 (또는 아닐지라도, 문제가 있다고 생각하는지조차도 모릅니다). 그러나 당신은 이미 DB에 잘못 인코딩 된 데이터를 가지고있을 것입니다. PostgreSQL은 물론로드 할 때 전체 유효성 검사를 수행하므로 실패 할 수 있습니다.

알려지지 않은 문자를 무시하도록 설정할 수있는 iconv와 같은 데이터를 통해 데이터를 제공하거나 "최상의 추측"으로 변환 할 수 있습니다.

+0

바로 iconv! 감사. –

관련 문제