2010-09-30 12 views
9

Ho una dichiarazione preparata:Java PreparedStatement UTF-8 problema personaggio

PreparedStatement st; 

e al mio codice cerco di utilizzare il metodo st.setString.

st.setString(1, userName); 

Il valore di userName è şakça. i metodi setString cambiano "şakça" in "? akça". Non riconosce i caratteri UTF-8. Come posso risolvere questo problema?

Grazie.

+1

Che database stai utilizzando?Ed è configurato per accettare Unicode (o qualunque cosa tu abbia bisogno di şakça) in quella colonna? – Thilo

risposta

35

Il numero di modi in cui questo si può rovinare è in realtà piuttosto impressionante. Se stai usando MySQL, prova ad aggiungere un parametro characterEncoding=UTF-8 alla fine del tuo URL di connessione JDBC:

jdbc:mysql://server/database?characterEncoding=UTF-8

Si dovrebbe anche verificare che il set di caratteri tabella/colonna è UTF-8.

+1

? CharacterEncoding = UTF-8 non funziona per me. Ho provato? CharacterEncoding = utf8 e funziona. – user4757345

+0

Entrambi "hanno funzionato" per me. La differenza per me era che "utf8" mancava di molti simboli, mentre "UTF-8" li copriva tutti. –

+0

funziona come un fascino – YyYo

3

metodi setString modifiche 'şakça' a '? Akça'

Come fai a sapere che setString cambia questo? O vedi il contenuto nel database e decidi questo?

Potrebbe essere che il database non sia configurato per UTF-8, o semplicemente che lo strumento che si usa per vedere i contetti del database (SQL * PLUS per Oracle ...) non sia in grado di diaplayer UTF-8 .

7

Ogniqualvolta un database cambia un carattere in ?, significa semplicemente che il codice punto del carattere in questione è completamente fuori dall'intervallo per la codifica dei caratteri quando la tabella è configurata per l'uso.

quanto riguarda la causa del problema: il ç si trova all'interno ISO-8859-1 gamma e ha esattamente lo stesso valore di codice come nella UTF-8 (U+00E7). Tuttavia, il punto di riferimento UTF-8 di ş si trova completamente al di fuori dell'intervallo ISO-8859-1 (U+015F mentre ISO-8859-1 passa solo a U + 00FF). Il DB non manterrà il carattere e lo sostituirà con ?.

Quindi, ho il sospetto che la tabella DB sia ancora configurata per utilizzare ISO-8859-1 (o in una delle altre codifiche ISO-8859 compatibili dove ç ha lo stesso codice come in UTF-8).

L'API Java/JDBC sta svolgendo perfettamente il proprio lavoro per quanto riguarda la codifica dei caratteri (Java usa Unicode fino in fondo) e anche la codifica della connessione DB JDBC è configurata correttamente. Se Java/JDBC avrebbe erroneamente usate ISO-8859-1, allora il risultato sarebbe stato persistente Åakça (la ş esistono dei byte 0xC5 e 0x9F che rappresenta Å e a in ISO-8859-1 e la ç esistono dei byte e 0xC30xA7 che rappresenta à e § in ISO-8859-1).

0

è possibile utilizzare la query come sotto per impostare stringhe unicode nell'istruzione preparata. PreparedStatement st= conn.prepareStatement("select * from users where username=unistr(?)");// unistr method is for oracle st.setString(1, userName);