2013-09-27 15 views
12

Attualmente sto creando una webapp Spring MVC e il database è la parte essenziale del backend. Per qualsiasi motivo, tuttavia, Spring rifiuta di elaborare i dati come UTF-8. Poiché le viste, le risorse e i browser sono impostati su Unicode, così come le tabelle nel database (e anche la lettura di un bel po 'di domande simili), ho stabilito che il problema risiede nella connessione al database.Come impostare useUnicode = true e characterEncoding = proprietà utf8 sulla connessione JDBC MySQL gestita dalla primavera

dovrebbe essere fornito il driver JDBC due elementi in ConnectionProperties: useUnicode (insieme a e characterEncoding (insieme a utf8) Si scopre, però, è impossibile

JDBC è un.. fagiolo, e come tale viene configurato tramite un file XML, in questo modo:

<property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
<property name="url" value="jdbc:mysql://localhost:3306/<database>" /> 
<property name="username" value="<not telling>" /> 
<property name="password" value="<not telling>" /> 

Questa impostazione converte tutti i caratteri non alfanumerici estratti dal database (ad esempio frecce o lettere greche) in discussione segni. Che è, ovviamente, inaccettabile.

ho provato diverse soluzioni: specificato l'URL di JDBC come jdbc:mysql://localhost:3306/<database>?useUnicode=yes&amp;characterEncoding=utf8, giocavo con my.ini file (e MySQL Workbench) per forzare tutto nel database per impostazione predefinita utf8 charset, e qualcosa che ha causato il più grande mal di testa: l'aggiunta di <property name="connectionProperties" value="useUnicode=yes;characterEncoding=utf8" />. Risulta, letteralmente impossibile impostare due proprietà Connection all'interno di un singolo bean, perché ... non vi è alcun carattere di separazione menzionato da nessuna parte (il bean proverà a leggerlo nel tentativo di impostare yes;characterEncoding=utf8 come valore di useUnicode). Quindi la mia domanda è: come faccio a utf8?

+0

Forse hai bisogno di un punto e virgola anche dopo 'characterEncoding = utf8', come menzionato qui: http://stackoverflow.com/questions/13359683/how-to-use-useunicode-yes-characterencoding-utf-8-with- dbcp – GriffeyDog

+0

@GriffeyDog Ho messo un punto e virgola lì, non lo stavo copiando dal codice. Non mi permetterà di compilare anche senza uno (beh, sarebbe - ma otterrei un'eccezione poco dopo). –

risposta

23

Il problema può essere causato specificando utf8 e non UTF-8. Da Using Character Sets and Unicode:

Quando si specificano codifiche di caratteri sul lato client, utilizzare nomi in stile Java. Nella tabella seguente sono elencati i nomi dei set di caratteri MySQL ei nomi in stile Java corrispondenti ...

e utf8 mappe per UTF-8. Provate il seguente URL JDBC:

jdbc: mysql: // localhost: 3306/useUnicode = yes & characterEncoding = UTF-8

+0

funziona, grazie. – egemen

5

Hai provato:

<property name="connectionProperties"> 
    <props> 
     <prop key="useUnicode">yes</prop> 
     <prop key="characterEncoding">utf8</prop> 
    </props> 
</property> 

E anche: Hai provato un semplice client Java (applicazione console) che collega al DB? L'UTF-8 funziona in questo caso?

+0

Ho provato la tua soluzione proprio ora, senza successo. Per un'applicazione di console semplice - Non l'ho (ancora). Lo farò presto. –

+0

Potresti essere più specifico sugli errori (se ce ne sono) con la configurazione? Anche quale bean hai configurato? (il '') –

+0

Non ci sono errori, questo è uno dei problemi! L'unico che ottengo è quando provo a specificare un singolo valore di proprietà. Come descritto sopra. E sto configurando un bean che ho chiamato dataSource, con la classe 'org.springframework.jdbc.datasource.DriverManagerDataSource', e le proprietà come descritto sopra. –

4

Si noti che se si utilizza Primavera di avvio, si può fare questo utilizzando proprietà all'interno di application.properties invece di dover aggiungere parametri aggiuntivi alle stringhe di connessione:

Mettere questo in applicazione.proprietà:

spring.datasource.connectionProperties=useUnicode=true;characterEncoding=utf-8; 
+0

Grazie. Questa è la migliore risposta da parte di tutti. Ho Spring JPA; Hibernate & Embedded H2 db e ogni volta che veniva caricato da import.sql, la codifica era incasinata. – Kefirchiks

+0

Questo non ha funzionato per me e sono curioso di sapere come potrebbe funzionare per chiunque altro. Anche la documentazione ufficiale non la menziona nell'elenco dei possibili parametri: https://docs.spring.io/spring-boot/docs/1.5.x/reference/html/common-application-properties.html –

+0

Questa proprietà non esiste più in Spring Boot 1.4 e versioni successive. Vedi https://stackoverflow.com/questions/40250678/set-jpa-utf-8-encoding-in-application-properties/40255073#40255073 –

2

ho avuto lo stesso problema durante l'utilizzo di primavera-boot + incorporato H2 + Hibernate, ma il problema era al momento della lettura script SQL. (data.sql) La codifica nel database è stata interrotta ogni volta che leggevo qualsiasi carattere straniero.

aggiungendo la seguente riga al mio application.properties risolto il problema:

spring.datasource.sqlScriptEncoding=UTF-8

Se è possibile accedere alla console e aggiungere alcuni dati manualmente. Se i personaggi stranieri appaiono nel modo giusto. Allora questa soluzione potrebbe funzionare bene per te.

Ho scoperto che la soluzione qui:

http://ufasoli.blogspot.com/2014/07/spring-boot-jpa-broken-encoding-on.html

+0

ha funzionato per me –

0

ho sprecato tempo per generare utf-8 tavoli. Non di sopra ha funzionato per me. Finalmente ho cambiato il mio mysql config file & funziona come un fascino. Se sei in Linux (sono in Ubuntu, sono sicuro che c'è un file per Windows) apri il file /etc/mysql/my.cnf e aggiungi il seguente codice.

[client] 
default-character-set=utf8 

[mysql] 
default-character-set=utf8 


[mysqld] 
collation-server = utf8_unicode_ci 
init-connect='SET NAMES utf8' 
character-set-server = utf8 

Non dimenticare di riavviare il servizio mysql.

Problemi correlati