2012-03-08 12 views
5

Per qualche strana ragione non riesco ad aggiungere dati UTF-8 al mio database MySQL. Quando inserisco un carattere non latino, viene memorizzato come ?????. Tutto il resto è memorizzato bene. Ad esempio, "questo è un esempio® ™" è memorizzato bene, ma "和 英 辞典" è memorizzato come "????".Impossibile memorizzare contenuto UTF-8 in MySQL utilizzando Java PreparedStatement

L'url collegamento è benissimo:

private DataSource getDB() throws PropertyVetoException { 
    ComboPooledDataSource db = new ComboPooledDataSource(); 
    db.setDriverClass("com.mysql.jdbc.Driver"); 
    db.setJdbcUrl("jdbc:mysql://domain.com:3306/db?useUnicode=true&characterEncoding=UTF-8"); 
    db.setUser("..."); 
    db.setPassword("..."); 
    return db; 
} 

sto usando PreparedStatement come ci si aspetterebbe, ho anche cercato di entrare "set nomi utf8", come qualcuno ha suggerito.

Connection conn = null; 
    PreparedStatement stmt = null; 
    ResultSet rs = null; 
    try { 
     conn = db.getConnection(); 

     stmt = conn.prepareStatement("set names utf8"); 
     stmt.execute(); 
     stmt = conn.prepareStatement("set character set utf8"); 
     stmt.execute(); 

        ... set title... 
     stmt = conn.prepareStatement("INSERT INTO Table (title) VALUES (?)"); 
     stmt.setString(1,title); 

     stmt.execute(); 
    } catch (final SQLException e) { 
    ... 

Il tavolo stesso sembra andare bene.

Default Character Set: utf8 
Default Collation: utf8_general_ci 
... 
Field title: 
Type text 
Character Set: utf8 
Collation: utf8_unicode_ci 

ho provato inserendo in Unicode ("和 英 辞典" in particolare) attraverso un editor di GUI e quindi selezionando dal tavolo - ed è stato restituito bene. Quindi questo sembra essere un problema con JDBC.

Cosa mi manca?

+0

Sei sicuro che 'title' ha il contenuto giusto? Forse lo leggi da un file usando ISO-qualunque? –

+0

Sì, quando inserisco un breakpoint sul titolo posso vedere che è effettivamente unicode (es: 和 英 辞典) e non ???? – nostromo

+0

'utf8' è una stringa, quindi racchiudila tra virgolette come:' "imposta nomi 'utf8'" '. Non scherzare con il set di caratteri. –

risposta

3

Ci sono 2 punti nel server mysql da controllare per impostare correttamente il set di caratteri UTF-8.

a livello di database

Ciò si ottiene mediante la creazione di esso:

CREATE DATABASE 'db' CHARACTER SET 'utf8'; 

livello Tabella

Tutte le tabelle devono essere in UTF-8 anche (che sembra sii il caso per te)

CREATE TABLE `Table1` (
    [...] 
) DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; 

La parte importante è DI DEFAULT CHARSET = utf8 COLLATE = utf8_general_ci

Infine, se il codice non fosse gestisce utf8 correttamente, si potrebbe avere costretto l'JVM per utilizzare la codifica utf8 cambiando le impostazioni all'avvio:

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

o cambiare l'ambiente variabile

"**JAVA_TOOLS_OPTIONS**" to -Dfile.encoding="UTF-8" 

o programmazione utilizzando:

System.setProperty("file.encoding" , "UTF-8"); 

(quest'ultimo potrebbe non avere l'effetto desiderato dal momento che la JVM memorizza nella cache valore della codifica dei caratteri di default all'avvio)

Speranza che ha aiutato.

+0

l'impostazione della codifica predefinita per jvm è utile per alcune cose, ma certamente non è richiesta per ottenere dati unicode dentro e fuori da un database. – jtahlborn

+0

sulla base del commento di nostromo ieri sul punto di interruzione. Possiamo supporre che il suo jvm stia già gestendo l'unicode correttamente, quindi sono d'accordo che non è richiesto nel suo caso. – Kharaone

+0

In realtà ci sono tre livelli. C'è anche il livello di connessione: http://stackoverflow.com/questions/9283575/getting-incorrectly-encoded-characters-when-retrieving-values-from-mysql-db –

1

Se si accede al proprio database mysql ed è in esecuzione show variables like 'character%'; , questo potrebbe fornire alcune informazioni.

Poiché si ottiene un rapporto uno a uno tra caratteri multi-byte e punti interrogativi, è probabile che la connessione stia eseguendo una conversione di set di caratteri e sostituisca i caratteri cinesi con il carattere di sostituzione per il byte singolo impostato.

5

Sulla stringa di connessione JDBC, basta impostare la codifica charset in questo modo:

jdbc: mysql: // localhost: 3306/dbname characterEncoding = utf8

3

Uso stmt.setNString(...) invece di stmt.setString(...).
Inoltre, non dimenticare di controllare le regole di confronto delle colonne nel lato del database.

+0

Mi hai salvato la giornata. –

0

Controllare anche locale -a su ubuntu default Ubuntu funziona con le impostazioni internazionali en_us e non ha altre impostazioni locali installate. deve specificare characterEncoding = utf8 durante la connessione tramite JDBC.

Problemi correlati