2009-04-08 4 views
15

두 데이터베이스를 동기화하는 Java 코드 (Timer Service) 인 두 개의 MySQL 데이터베이스가있는 시나리오가 있습니다. 두 번째 데이터베이스에로드 된 데이터를 수정할 수있는 웹 응용 프로그램 등이 있습니다.JDBC 커넥터를 사용하여 MySQL에서 UTF-8 데이터를 Java에서 읽거나 쓰는 데 문제가 발생했습니다. 5.1

모든 데이터베이스 액세스는 iBATIS를를 사용한다 (하지만 난, PreparedStatement s와 ResultSet의 JDBC를 사용하여 동일한 문제가 감지) 내 자바 코드는 첫 번째 데이터베이스에서 데이터를 읽어

을, 나는 'ó' 때처럼 문자를 얻을 실제로는 'ó'이어야합니다. 이 데이터는 두 x 째 데이터베이스를 수정하지 않고 wroten됩니다.

나중에 웹 응용 프로그램에서로드 된 데이터를 볼 때 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />에도 불구하고 익명 문자가 표시됩니다.

내가 사용하여 데이터를 디코딩하는 경우

...

new String(data.getBytes("UTF-8")); 

... 내가 올바르게 문자 (O)를 시각화. 하지만 웹 응용 프로그램 양식을 사용하여 데이터를 수정할 때 데이터베이스가 UTF-8이고 내 연결 문자열이 characterEncoding을 사용하지만 두 번째 데이터베이스에서 UTF-8로 데이터가 업데이트되지 않기 때문에이 솔루션을 일반적인 규칙으로 사용할 수 없습니다. characterSetResults 및 useUnicode 매개 변수).

character_set_client-->utf8 
character_set_connection-->utf8 
character_set_database-->utf8 
character_set_filesystem-->binary 
character_set_results-->utf8 
character_set_server-->latin1 
character_set_system-->utf8 
character_sets_dir-->/usr/local/mysql51/share/mysql/charsets/ 

character_set_server 설정을 변경할 수 없습니다 나는 내가 뭘 잘못 알고하지 않습니다! : 내 자바 코드에서

나는 다음과 같은 데이터베이스 설정을 가져

JDBC 커넥터 (mysql-connector-java-5.1.5-bin.jar)를 사용하여 MySQL에서 UTF-8 데이터를 읽으려면 어떻게해야합니까?

첫 번째 데이터베이스에서 데이터를 읽거나 두 번째 데이터베이스에 데이터를 쓰는 데 문제가 있습니까?

답변

5

JVM의 file.encoding 속성을 UTF-8로 설정하면 모든 로캘/인코딩 민감 API가 디코딩 된 문자열을 UTF8로 간주합니다.

java -Dfile.encoding=UTF-8 .... 

당신은 또한 톰캣 설정의 자세한 설명은 this SO question을 참조 할 수 있습니다 :

예를 들어, 자바 응용 프로그램을 실행하여 명령 줄에서 설정할 수 있습니다.

5

체인의 어느 시점에서 UTF-8 – 인코딩 된 바이트가 Latin1로 디코딩됩니다. 설정 목록에서 "character_set_server"에 이런 일이 발생했습니다. 이 값들이 어떻게 얻어 졌는지 알지 못하면 그것들을 해석하기가 어렵습니다.

system property "file.encoding"의 값을 확인하십시오. 그것이 "UTF-8"이 아닌 경우 바이트를 문자로 디코딩 할 때마다 문자 인코딩으로 명시 적으로 "UTF-8"을 지정해야합니다. 예를 들어 String 생성자를 byte[]으로 호출하거나 InputStreamReader을 사용합니다.

기본 플랫폼 인코딩에 의존하지 않고 문자 인코딩을 명시 적으로 지정하는 것이 가장 좋습니다.

+0

이되어야한다 UTF-8 이후 –

+0

@ScottChu 죄송합니다. 귀하의 의견을 이해할 수 없습니다. – erickson

37

조금 늦게하지만이 당신을 도울 것입니다 :

DriverManager.getConnection(
      "jdbc:mysql://" + host + "/" + dbName 
      + "?useUnicode=true&characterEncoding=UTF-8", user, pass); 
+0

일반 응용 프로그램에서는 응용 프로그램을 만들지 않습니다. 따라서이 매개 변수를 전달할 수 없습니다. 다른 방법으로 독서 후에 바꿀 수 있나요? / –