2012-01-23 2 views
9

내 개발 데이터를 DB에 쓰려면 import.sql을 사용하고 있습니다. 나는 MySQL 서버 5.5을 사용하고 있는데 내의 persistence.xml은 여기에 있습니다 : 내 import.sql에서Hibernate/JPA import.sql utf8 문자가 손상됨

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" 
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
<persistence-unit name="MobilHM" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <class>tr.com.stigma.db.entity.Doctor</class> 
    <class>tr.com.stigma.db.entity.Patient</class> 
    <class>tr.com.stigma.db.entity.Record</class> 
    <class>tr.com.stigma.db.entity.User</class> 
    <properties> 
     <property name="hibernate.hbm2ddl.auto" value="create" /> 
     <property name="hibernate.show_sql" value="true" /> 
     <property name="hibernate.format_sql" value="true" /> 
     <!-- Auto detect annotation model classes --> 
     <property name="hibernate.archive.autodetection" value="class" /> 
     <!-- Datasource --> 
     <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" /> 
     <property name="hibernate.connection.username" value="mobilhm" /> 
     <property name="hibernate.connection.password" value="mobilhm" /> 
     <property name="hibernate.connection.url" value="jdbc:mysql://localhost/mobilhm" /> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" /> 
    </properties> 
</persistence-unit> 

일부 문자가 DB에 제대로 표시되지 않습니다. 예를 들어 문자 ü는 db로 표시됩니다. MySQL의에서 기본 문자셋은 UTF-8입니다 만들고 손상된 문자를 만드는 나는 =

CREATE TABLE doctor (doctorId int unsigned NOT NULL AUTO_INCREMENT, name varchar(45) NOT NULL, surname varchar(45) NOT NULL, PRIMARY KEY (doctorId)) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

내가 MySQL의 가져 오기/내보내기 관리자 데이터를 사용하여 가져올 경우 것이 올바른하지만 hibernate.hbm2ddl.auto를 사용하고 이상한처럼 만드는 테이블을 해요 .

어떻게 해결할 수 있습니까?

편집 : 또한 내가

<property name="hibernate.connection.useUnicode" value="true" /> 
<property name="hibernate.connection.characterEncoding" 
      value="UTF-8" /> 
<property name="hibernate.connection.charSet" value="UTF-8" /> 

가 persistence.xml을 위해 추가 시도했습니다. 그러나 도움이되지 않았습니다.

수정 : 나는 그것을 결국 풀었다. 나는 Tomcat을 사용하고 있으며 그것은 최대 절전 모드 나 MySQL이 아닌 손상 지점이다. 나는 JAVA_OPTS = -Dfile.encoding = UTF-8 명령으로 시작했고 내 문제는 사라진다.

질문 제목이 오해의 소지가되었습니다. 그 죄송합니다.

답변

10

하이버 네이트는 해당 파일에 대한 독자를 만들 때 명시적인 인코딩없이 직접 new InputStreamReader(stream);을 사용합니다 (기본 실행 플랫폼 charset 인코딩은 사용/사용됨).

그래서, 다른 말로하면, 당신의 import.sql 파일은 기본 실행 플랫폼 charset 인코딩에 있어야합니다.


옵션 https://hibernate.atlassian.net/browse/HBX-711가 수정 :

  • 가에 -Dfile.encoding=UTF-8 추가 오래된 (! 2006) 공개 한 패치를 전송하고자하는 경우 이에 대한 문제는,이

    JAVA_OPTS 환경 변수 : 예 :

    # Linux/Unix 
    export JAVA_OPTS=-Dfile.encoding=UTF-8 
    # Windows 
    set JAVA_OPTS=-Dfile.encoding=UTF-8 
    
    # Attention, check before if your JAVA_OPTS doesnt already have a value. If so, 
    # then it should be 
    export JAVA_OPTS=$JAVA_OPTS -Dfile.encoding=UTF-8 
    # or 
    set JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding=UTF-8 
    
  • Maven 플러그인에서 속성을 설정하십시오 (최대 절전 모드 파일을 가져 오는 코드를 실행하는 방법에 따라 surefire, failsafe 또는 기타 일 수 있음). surefire의 예 :

    <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-surefire-plugin</artifactId> 
        <configuration> 
         <argLine>-Dfile.encoding=UTF8</argLine> 
        </configuration> 
    </plugin> 
    
+2

+1 올바른 이유가 있지만 테스트가 플랫폼에 따라 다르므로 가정이 올바르지 않습니다. 가장 간단한 해결책은 IDE에서 텍스트 파일 인코딩을 UTF-8로 설정하거나 @Jaroslav Frolikov가 이미 명시한대로 maven을 사용한다면' -Dfile.encoding = UTF8 '입니다. –

+0

여전히 2017 년에는 작동하지 않습니다. – gstackoverflow

2

여기에을 설정하지 않고도 신뢰할 수있는 솔루션이 있습니다.

가져 오기 파일은 UTF-8으로 인코딩되지만 Java 기본 문자 세트는 다른 것으로 가정합니다 (예 : latin1).

1) = com.pragmasphere.hibernate.CustomSqlExtractor import_files_sql_extractor hibernate.hbm2ddl.import_files_sql_extractor의 맞춤 클래스를 정의

2)

는 구현에 의해 판독 절전 무효 문자열 해결.

package com.pragmasphere.hibernate; 

import org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor; 

import java.io.IOError; 
import java.io.Reader; 
import java.io.UnsupportedEncodingException; 
import java.nio.charset.Charset; 

public class CustomSqlExtractor extends MultipleLinesSqlCommandExtractor { 

    private final String SOURCE_CHARSET = "UTF-8"; 

    @Override 
    public String[] extractCommands(final Reader reader) { 
     String[] lines = super.extractCommands(reader); 

     Charset charset = Charset.defaultCharset(); 
     if (!charset.equals(Charset.forName(SOURCE_CHARSET))) { 
      for (int i = 0; i < lines.length; i++) { 
       try { 
        lines[i] = new String(lines[i].getBytes(), SOURCE_CHARSET); 
       } catch (UnsupportedEncodingException e) { 
        throw new IOError(e); 
       } 
      } 
     } 

     return lines; 
    } 
} 

SOURCE_CHARSET의 값은 가져 오기 파일에서 사용되는 다른 인코딩으로 변경할 수 있습니다.