2013-09-27 115 views
12

Tôi hiện đang xây dựng một ứng dụng web MVC của Spring và cơ sở dữ liệu là phần phụ trợ quan trọng. Tuy nhiên, vì bất kỳ lý do gì, Spring từ chối xử lý dữ liệu dưới dạng UTF-8. Vì các khung nhìn, tài nguyên và trình duyệt được đặt thành Unicode và các bảng trong cơ sở dữ liệu (và cũng đọc một số câu hỏi tương tự), tôi đã thiết lập vấn đề nằm trong kết nối cơ sở dữ liệu.Cách đặt thuộc tính useUnicode = true và characterEncoding = utf8 trên kết nối JDBC của MySQL do Spring quản lý

Các JDBC driver cần được cung cấp hai mục trong connectionProperties: useUnicode (thiết lập để và characterEncoding (thiết lập để utf8) Hóa ra, tuy nhiên, đó là không thể

JDBC là một.. đậu, và như vậy được cấu hình thông qua một tập tin XML, như vậy:

<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>" /> 

thiết lập này chuyển đổi tất cả các ký tự không tự chữ và số kéo từ cơ sở dữ liệu (chẳng hạn như mũi tên hoặc chữ cái Hy Lạp) vào câu hỏi điểm. Đó là, rõ ràng, không thể chấp nhận.

tôi đã cố gắng nhiều giải pháp: chỉ định URL JDBC như jdbc:mysql://localhost:3306/<database>?useUnicode=yes&amp;characterEncoding=utf8, chơi với my.ini tập tin (và MySQL Workbench) để buộc tất cả mọi thứ trong cơ sở dữ liệu để mặc định utf8 charset, và cái gì đó gây ra đau đầu lớn nhất: thêm <property name="connectionProperties" value="useUnicode=yes;characterEncoding=utf8" />. Hóa ra, không thể thiết lập hai connectionProperties trong một bean đơn, bởi vì ... không có ký tự phân tách được đề cập ở bất kỳ đâu (bean sẽ cố đọc nó khi cố gắng đặt yes;characterEncoding=utf8 làm giá trị useUnicode). Vì vậy, câu hỏi của tôi là: làm thế nào để tôi utf8?

+0

Có lẽ bạn cần dấu chấm phẩy sau 'characterEncoding = utf8', như được đề cập ở đây: http://stackoverflow.com/questions/13359683/how-to-use-useunicode-yes-characterencoding-utf-8-with- dbcp – GriffeyDog

+0

@GriffeyDog Tôi đặt dấu chấm phẩy ở đó, tôi đã không sao chép nó từ mã. Nó sẽ không cho phép tôi biên dịch mà không có ai (tốt, nó sẽ - nhưng tôi sẽ nhận được một ngoại lệ ngay sau đó). –

Trả lời

23

Sự cố có thể được gây ra bằng cách chỉ định utf8 chứ không phải UTF-8. Từ Using Character Sets and Unicode:

Khi chỉ định mã hóa ký tự ở phía máy khách, hãy sử dụng tên kiểu Java. Bảng sau liệt kê MySQL bộ ký tự tên và tương ứng với tên Java-style ...

utf8 bản đồ để UTF-8. Hãy thử các URL JDBC sau:

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

+0

nó hoạt động, cảm ơn bạn. – egemen

5

Bạn có thử:

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

Và thêm: Bạn đã thử một đơn giản khách hàng Java (giao diện điều khiển ứng dụng) kết nối đến DB? UTF-8 có hoạt động trong trường hợp này không?

+0

Tôi đã thử giải pháp của bạn ngay bây giờ, không có kết quả. Đối với một ứng dụng giao diện điều khiển đơn giản - tôi chưa có (chưa). Tôi sẽ sớm thôi. –

+0

Bạn có thể cụ thể hơn về các lỗi (nếu có) với cấu hình không? Bạn cũng định cấu hình đậu nào? ('') –

+0

Không có lỗi gì cả, đó là một trong những vấn đề! Người duy nhất tôi nhận được là khi tôi cố gắng chỉ định một giá trị thuộc tính duy nhất. Như mô tả ở trên. Và tôi đang cấu hình một bean mà tôi đặt tên là dataSource, với lớp 'org.springframework.jdbc.datasource.DriverManagerDataSource' và các thuộc tính như được mô tả ở trên. –

4

Lưu ý rằng nếu bạn đang sử dụng Spring Boot, bạn có thể làm điều này sử dụng các thuộc tính trong phạm vi application.properties thay vì phải thêm thông số bổ sung vào chuỗi kết nối của bạn:

Đặt ứng dụng này vào ứng dụng.thuộc tính:

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

Cảm ơn bạn. Đây là câu trả lời hay nhất từ ​​tất cả. Tôi có Spring JPA; Hibernate & Embedded H2 db và mỗi khi nó được nạp từ import.sql, mã hóa đã bị rối tung lên. – Kefirchiks

+0

Điều này không có tác dụng đối với tôi và tôi tò mò làm sao nó có thể làm việc cho bất cứ ai khác. Tài liệu chính thức cũng không đề cập đến nó trong danh sách các tham số có thể có: https://docs.spring.io/spring-boot/docs/1.5.x/reference/html/common-application-properties.html –

+0

không còn tồn tại trong Spring Boot 1.4 trở lên. Xem https://stackoverflow.com/questions/40250678/set-jpa-utf-8-encoding-in-application-properties/40255073#40255073 –

2

Tôi gặp vấn đề tương tự khi sử dụng Spring-boot + embedded H2 + Hibernate, nhưng vấn đề là tại thời điểm đọc tập lệnh SQL. (data.sql) Mã hóa trong cơ sở dữ liệu bị hỏng mỗi khi tôi đọc bất kỳ ký tự nước ngoài nào.

Thêm dòng sau vào application.properties tôi giải quyết vấn đề:

spring.datasource.sqlScriptEncoding=UTF-8

Nếu có thể đi đến giao diện điều khiển và thêm một số dữ liệu bằng tay. Nếu các ký tự nước ngoài xuất hiện đúng cách. Sau đó, giải pháp này có thể làm việc tốt cho bạn.

Tôi đã tìm thấy rằng giải pháp ở đây:

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

+0

nó làm việc cho tôi –

0

tôi lãng phí thời gian để tạo ra utf-8 bảng. Không phải ở trên làm việc cho tôi. Cuối cùng tôi đã thay đổi tập tin cấu hình mysql & nó hoạt động giống như một sự quyến rũ. Nếu bạn đang ở trong linux (Tôi đang trong ubuntu, tôi chắc chắn có một tập tin cho các cửa sổ) mở tập tin /etc/mysql/my.cnf và thêm mã sau đây.

[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 

Đừng quên khởi động lại dịch vụ mysql.

Các vấn đề liên quan