2010-02-18 3 views
1

Java에서 데이터베이스에 연결하는 응용 프로그램을 개발 중입니다. 고객은 SQL Server를 보유하고 있으며 개발 기간 동안 라이센스를 구매하기를 원하지 않는 한 Microsoft의 SQLExpress 버전을 사용해 보았습니다. 안타깝게도 SQL Server Express는 네트워크 액세스를 허용하지 않기 때문에 동일한 데이터베이스에서 네트워크를 통해 작업 할 수 없으며 모든 개발자 클라이언트에 SQL Server Express 서버를 설치해야합니다.MS SQL에서 MySQL로 Java 전환 - 문자 집합

오늘 아침 나는 개발 프로세스 중에 MySQL로 전환하기로 결정했습니다. UTF8 charset을 사용하여 MySQL 데이터베이스를 만들고 데이터를 CSV 파일로 내 보낸 다음 UTF8로 변환하여 가져 왔습니다.

Java와 JDBC 드라이버를 연결하고 실행 중에 이상한 동작이 나타납니다. 결과는 SQL Server에 연결하는 클라이언트와 완전히 다릅니다. 나는 자바 글루 코드 인 myselft에 SQL을 작성했으며 Hibernate 나 JPA와 같은 프레임 워크를 사용하지 않는다.

문제는 문자 인코딩과 관련이 있다고 생각합니다. 소스 코드 파일은 CP1252로 인코딩되어 있습니다. Windows에서 Eclipse로 개발하기 시작했고 기본 설정을 신뢰할 수 있기 때문에 CP1252로 인코딩되었습니다. ResultSet 객체를 가져 오는 데이터베이스를 쿼리 한 다음 ResultSet에서 제공하는 getter 메서드를 사용하여 데이터를 읽습니다. 나는 데이터를 가져 오는 동안 어떠한 문자 변환도하지 않는다.

이제 문제는 암호화되지 않은 인코딩 된 출력이 아니라 NullPointerExceptions 및 이상한 데이터 처리입니다. 예를 들면 : 나는 Jobs (Job을 나타내는 객체, 이름, ID,화물 및 모든 물건)을 비교하는 메소드를 작성했다. 런타임 중 결과가 다릅니다. 일부 작업은 SQL Server에서는 같고 일부 작업은 MySQL에서 수행되지만 SQL Server 결과는 올바른 작업입니다.

방금 ​​데이터베이스 속성을보고 SQL Server의 문자 인코딩이 ISO-Latin-1임을 확인했습니다. 쾰른에서 여러분의 도움과 관련, 마르코에 대한

감사

+0

스택 추적의 관련 부분을 추가하십시오. –

답변

0

나는 MS SQL 데이터는 라틴 인코딩 된 경우 MS SQL에 대한 작은하지만, MySQL의에 UTF-8 데이터베이스로 가져 오기 해야 최종 알고이 실패하고 데이터가 손상됩니다.

데이터를 먼저 고정하려고합니다. 덤프 파일과 mySQL의 latin1 데이터베이스를 변환하지 않고 프로세스를 재 시도 할 수 있습니까? 이 계획을 세울 때

것은주의 :

플러스, MySQL과 MS SQL 사이의 데이터 유형에 notable differences 것 같다 당신이 이름으로 반드시 능력으로가 아니라 데이터 형식을 일치합니다. 예 : MySQL VARCHAR는 최대 255자를 보유 할 수 있지만 SQL Server VARCHAR는 최대 4000자를 보유 할 수 있습니다. 이 경우 VARCHAR 대신 MySQL TEXT 열 유형을 사용해야합니다.

+0

Excel에서 데이터를 내보내고 CSV를 편집기로 보냈습니다. 거기에서 나는 Latin1에서 UTF8로 charset을 변환했다. 이것은 MySQL 내부의 문자가 올바르게 표시 되었기 때문에 효과가있었습니다. 하지만 어쩌면 나는 모든 것을 다시하고 Latin1 데이터베이스를 만들 것입니다 ... – Marco

+0

@Marco 아, 알겠습니다, 그 과정은 효과가 있습니다. 순수한 latin1 전송은 여전히 ​​내가 생각하는 가치가있을 것이다. 차이점이 무엇인지 보여주는 예제 데이터를 보는 것이 좋습니다. 또한 업데이트 된 답변을 참조하십시오. 포인터 일 수도 있습니다. –