2012-01-23 19 views
9

Geliştirme verilerimi DB'ye yazmak için import.sql kullanıyorum. Ben MySQL Server 5.5 kullanıyorum ve benim persistence.xml burada: my import.sql içindeHazırda bekletme/JPA import.sql utf8 karakterleri bozuk

<?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> 

Bazı karakterler DB doğru gösterilmez. Örneğin, karakter ü db'de becomes olur. MySQL Standart charset utf-8 ve oluşturmak bozuk karakterler yapar I =

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; 

Ben MySQL ithalat/ihracat müdürü verileri kullanılarak import eğer doğru ama hibernate.hbm2ddl.auto kullanarak olduğuna garip gibi oluşturarak tablolar değilim .

Bunu nasıl çözebilirim?

Düzenleme: Ayrıca ben

<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 ekleyerek denedim. Ama yardımcı olmadı.

Düzeltme: Sonunda çözdüm. Tomcat kullanıyorum ve bu, hazırda bekletme veya mysql olmayan bir noktadır. Ben set JAVA_OPTS = -Dfile.encoding = UTF-8 komutu ile başladım ve benim sorunum gider.

Şimdiki soru başlığı yanıltıcı oldu. Bunun için özür dilerim.

cevap

10

Okuyucuyu bu dosya için oluştururken, hazırda bekletme kodlaması olmadan doğrudan doğruya new InputStreamReader(stream);'u kullanır (varsayılan yürütme platformu karakter kümesi kodlaması kabul edilir/kullanılır).

Yani, başka bir deyişle, import.sql dosya varsayılan yürütme platformu charset kodlama olmalıdır.


Seçenekler https://hibernate.atlassian.net/browse/HBX-711 düzeltmek için:

  • için -Dfile.encoding=UTF-8 Ekle eski (! 2006) açık bir bir yama göndermek istemesi durumunda bunun için konu yoktur

    JAVA_OPTS gibi bir ortam değişkeni, aşağıdaki gibi:

    # 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 eklentinizdeki bir özelliği (hazırda bekletilen dosyayı içe aktaran kodu nasıl çalıştırdığınıza bağlı olarak surefire, veya başka bir ürün olabilir) ayarlayın. surefire için örnek:

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

+1 doğru nedenle, ancak varsayım doğru değildir, çünkü testleriniz platforma bağlı olacaktır. En basit çözüm, daha önce belirtildiği gibi @Jaroslav Frolikov gibi maven kullanılıyorsa, IDE-8 kodlu metin dosya kodlamasını IDE veya ' -Dfile.encoding = UTF8' olarak ayarlamaktır. –

+0

Hala 2017'de çalışmıyor – gstackoverflow

2

Burada, herhangi bir sistem özelliğini ayarlamadan bir güvenilir bir çözümdür.

İçe aktarma dosyalarının UTF-8 ile kodlandığını varsayıyoruz, ancak Java varsayılan karakter takımı farklı, yani latin1 diyelim.

1) = com.pragmasphere.hibernate.CustomSqlExtractor import_files_sql_extractor hibernate.hbm2ddl.import_files_sql_extractor için özel bir sınıf tanımlamak

2)

uygulanmasında hazırda tarafından okunan geçersiz dizeleri düzeltin.

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; 
    } 
} 

Sen ithalat dosyaları tarafından kullanılan başka bir kodlama SOURCE_CHARSET değerini değiştirebilir.