2010-09-30 46 views
9

Tôi có một tuyên bố chuẩn bị:Java PreparedStatement tự UTF-8 vấn đề

PreparedStatement st; 

và mã của tôi tôi cố gắng để sử dụng phương pháp st.setString.

st.setString(1, userName); 

Giá trị của userName là şakça. phương thức setString thay đổi 'şakça' thành '? akça'. Nó không nhận ra các ký tự UTF-8. Làm thế nào tôi có thể giải quyết vấn đề này?

Cảm ơn.

+1

Bạn đang sử dụng cơ sở dữ liệu nào?Và nó được cấu hình để chấp nhận Unicode (hoặc bất cứ điều gì bạn cần cho şakça) trong cột đó? – Thilo

Trả lời

35

Số lượng các cách thức này có thể bị vặn lên thực sự khá ấn tượng. Nếu bạn đang sử dụng MySQL, hãy thử thêm một tham số characterEncoding=UTF-8 đến cuối URL kết nối JDBC của bạn:

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

Bạn cũng nên kiểm tra xem các ký tự bảng/cột là UTF-8.

+1

? CharacterEncoding = UTF-8 không hoạt động đối với tôi. Tôi đã thử? CharacterEncoding = utf8 và nó hoạt động. – user4757345

+0

Cả hai "làm việc" cho tôi. Sự khác biệt đối với tôi là "utf8" thiếu rất nhiều biểu tượng, trong khi "UTF-8" bao trùm tất cả chúng. –

+0

hoạt động như một sự quyến rũ – YyYo

3

setString phương pháp thay đổi 'şakça' để '? Akça'

Làm thế nào để bạn biết rằng setString thay đổi này? Hay bạn thấy nội dung trong cơ sở dữ liệu và quyết định điều này?

Có thể cơ sở dữ liệu không được định cấu hình cho UTF-8, hoặc đơn giản là công cụ bạn sử dụng để xem các đối tượng của cơ sở dữ liệu (SQL * PLUS cho Oracle ...) không có khả năng xếp UTF-8 .

7

Bất cứ khi nào cơ sở dữ liệu thay đổi ký tự thành ?, thì điều đó đơn giản có nghĩa là điểm của ký tự được đề cập hoàn toàn nằm ngoài phạm vi mã hóa ký tự khi bảng được cấu hình để sử dụng.

Vì nguyên nhân của sự cố: ç nằm trong phạm vi ISO-8859-1 và có cùng một điểm giống như trong UTF-8 (U+00E7). Tuy nhiên, điểm mã UTF-8 của ş nằm hoàn toàn nằm ngoài phạm vi ISO-8859-1 (U+015F trong khi ISO-8859-1 chỉ lên tới U + 00FF). DB sẽ không tồn tại nhân vật và thay thế nó bằng ?. Vì vậy, tôi nghi ngờ rằng bảng DB của bạn vẫn được định cấu hình để sử dụng ISO-8859-1 (hoặc trong một trong các mã ISO-8859 tương thích khác, trong đó ç có cùng một điểm giống như trong UTF-8).

API Java/JDBC đang thực hiện công việc của nó hoàn toàn phù hợp với mã hóa ký tự (Java sử dụng Unicode tất cả các cách) và mã hóa kết nối JDBC DB cũng được định cấu hình chính xác. Nếu Java/JDBC sẽ có sai đã qua sử dụng tiêu chuẩn ISO-8859-1, thì kết quả tiếp tục tồn tại sẽ được Åakça (các ş tồn tại của byte 0xC50x9F đại diện Åa trong ISO-8859-1 và ç tồn tại của byte 0xC30xA7 đại diện cho ç trong ISO-8859-1).

0

bạn có thể sử dụng truy vấn như dưới đây để đặt chuỗi unicode trong câu lệnh đã chuẩn bị. PreparedStatement st= conn.prepareStatement("select * from users where username=unistr(?)");// unistr method is for oracle st.setString(1, userName);