2013-02-06 3 views
1

테이블에 MEDIUMBLOB 필드가있는 데이터베이스가 있고 각 테이블에 ENGINE=InnoDB DEFAULT CHARSET=utf8이 있습니다.MySQL, Java 및 UTF8

URL에 useUnicode=true&characterEncoding=UTF8&character_set_client=UTF8&character_set_database=UTF8&character_set_results=UTF8&character_set_server=UTF8&character_set_system=UTF8으로 데이터베이스에 연결합니다.

(I이 같은 결과를 바로 useUnicode=true&characterEncoding=UTF8으로 노력했다.)

내가 명령 줄에서 mysql을 사용하여 데이터베이스의 값을 볼 때, 나는 비 ASCII 문자가 잘 볼 수 있습니다.

그러나 데이터베이스에서 문자열을 읽을 때 executeQuery()getString() 나는 횡설수설합니다. 값을 올바르게 읽으려면 어떻게해야합니까?

나는 log4j를 사용하여 데이터베이스에 쓰고있는 문자열과 내가 읽은 문자열을 보여주고 있습니다.

+1

그런 다음 어떻게 * 표시하고 있습니까? 웹 응용 프로그램이나 그와 유사한 것을 통해 데이터베이스에 올바른 데이터를 가져 오면 브라우저에 전송되도록 인코딩해야 할 때 뭔가 잘못 될 수 있습니다. –

+1

(나는 "횡설수설 (gabberish)"에 의해 비 ASCII 문자를 예상 한 모든 종류의 괴상한 문자를 의미한다고 가정하고 있습니다. [mojibake] (http://en.wikipedia.org/wiki/Mojibake) 다시 물음표 만 보니 다른 문제입니다.) –

+0

콘솔을 사용하고 있습니까? 기기가 문자를 표시하는 대상은 무엇입니까? –

답변

5

문자열이 아니라 BLOB입니다. 따라서 getBytes을 원하고 수동으로 해독하십시오.

new String(bytes, "UTF-8"); //Subsitute "UTF-8" with whatever encoding the blob is in 

더 투명하게 지원하려면 중간 텍스트 열을 UTF-8로 정의하십시오. 그러면 모든 구성이 효과적이되고 getString을 사용하여 자동으로 적절한 문자열을 얻습니다.

+2

그래, 뭔가 비슷한 코멘트를 추가하려고했다 - 나는 시작 필드 유형을 발견하지 못했습니다. (당신이 틀린 타입을 사용하여 가치를 물어 보려고 할 때 드라이버가 실제로 실패 할 것이라는 것을 희망한다.) –

+0

@JonSkeet : 나도 그러길 바란다. 그러나 그것은 분명히 * 아니다. MySQL이하는 일. 그들은 항상 당신에게 뭔가를하려고 노력합니다 *. 기회가 있더라도 뭔가 잘못되었습니다. –

+0

@ JoachimSauer : 참. 내 경험으로는 다른 많은 데이터베이스 (또는 .NET 및 Java 드라이버)도 마찬가지입니다. –