2010-09-30 32 views
9

Mam przygotowaną oświadczenie:Java PreparedStatement UTF-8 Problem charakter

PreparedStatement st; 

i na mojego kodu próbuję użyć metody st.setString.

st.setString(1, userName); 

Wartość userName to şakça. Metody setString zmieniają "şakça" na "? akça". Nie rozpoznaje znaków UTF-8. Jak mogę rozwiązać ten problem?

Dzięki.

+1

Jakiej bazy danych używasz?I czy jest skonfigurowany tak, aby akceptował Unicode (lub cokolwiek, czego potrzebujesz dla şakça) w tej kolumnie? – Thilo

Odpowiedz

35

Liczba sposobów, które można zepsuć, jest całkiem imponująca. Jeśli używasz MySQL, spróbuj dodać parametr characterEncoding=UTF-8 do końca swojego połączenia JDBC URL:

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

Należy również sprawdzić, czy zestaw znaków tabela/kolumna jest UTF-8.

+1

? CharacterEncoding = UTF-8 nie działa dla mnie. Próbowałem? CharacterEncoding = utf8 i to działa. – user4757345

+0

Oboje "pracowali" dla mnie. Różnica była dla mnie taka, że ​​"utf8" zabrakło wielu symboli, a "UTF-8" pokrył je wszystkie. –

+0

działa jak urok – YyYo

3

setString metod zmiany 'şakça' do '? Akça'

Skąd wiesz, że to zmienia setString? Czy widzisz zawartość w bazie danych i decydujesz o tym?

Może to oznaczać, że baza danych nie jest skonfigurowana dla UTF-8, lub po prostu narzędzie używane do wyświetlania kontentu bazy danych (SQL * PLUS dla Oracle ...) nie jest w stanie przeniknąć do UTF-8 .

7

Ilekroć baza danych zmienia znak na ?, oznacza to po prostu, że kodepoint danej litery jest całkowicie poza zakresem kodowania znaków, ponieważ tabela jest skonfigurowana do użycia.

Co do przyczyny problemu: ç leży ISO-8859-1 zakresie i ma dokładnie taki sam jak w UTF-8 kodowy (U+00E7). Jednak punkt kodowy UTF-8 z ş leży całkowicie poza zakresem ISO-8859-1 (U+015F, a ISO-8859-1 tylko do U + 00FF). DB nie przetrwa postaci i zastąpi ją przez ?.

Podejrzewam, że twoja tabela DB jest nadal skonfigurowana do używania ISO-8859-1 (lub w jednym z innych zgodnych kodowań ISO-8859, gdzie ç ma taki sam kodepunkt jak w UTF-8).

Interfejs Java/JDBC API wykonuje swoją pracę doskonale w odniesieniu do kodowania znaków (Java w całości używa Unicodu) i kodowanie połączenia JDBC DB jest również poprawnie skonfigurowane. Jeśli Java/JDBC miałby nieprawidłowo używane ISO-8859-1, wówczas Trwały efekt byłby Åakça (the ş exist bajtów 0xC5 i 0x9F który reprezentuje Å i a w ISO-8859-1 i ç opuszczeniu w bajtów 0xC3 i 0xA7, który reprezentuje à i § w ISO-8859-1).

0

możesz użyć zapytania jak poniżej, aby ustawić ciągi znaków Unicode w przygotowanej instrukcji. PreparedStatement st= conn.prepareStatement("select * from users where username=unistr(?)");// unistr method is for oracle st.setString(1, userName);