2013-09-27 12 views
12

Aktualnie tworzę aplikację webową Spring MVC, a baza danych jest istotną częścią zaplecza. Z jakiegoś powodu Spring odmawia przetwarzania danych jako UTF-8. Ponieważ widoki, zasoby i przeglądarki są ustawione na Unicode, tak samo jak tabele w bazie danych (a także sporo podobnych pytań), ustaliłem, że problem leży w połączeniu z bazą danych.Jak ustawić właściwości useNicode = true i characterEncoding = utf8 na zarządzanym przez sprężynę połączeniu JDBC MySQL

Sterownik JDBC należy zapewnić dwie pozycje w connectionProperties: useUnicode (ustawiony na tak i characterEncoding (zestaw do utf8) Okazuje się jednak, że to niemożliwe

JDBC jest.. fasola, i jako taki jest skonfigurowany poprzez plik XML, tak jak poniżej:

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

taka konfiguracja konwertuje wszystkie znaki niealfanumeryczne pobierane z bazy danych (takich jak strzałki lub greckimi literami) pod znakiem zapytania znaki. Co jest oczywiście niedopuszczalne.

Próbowałem wielu rozwiązań: określono JDBC URL jako jdbc:mysql://localhost:3306/<database>?useUnicode=yes&amp;characterEncoding=utf8, grał z my.ini pliku (i MySQL Workbench), aby wymusić wszystko w bazie danych do domyślnego utf8 charset, i coś, co spowodowało największy ból głowy: dodawanie <property name="connectionProperties" value="useUnicode=yes;characterEncoding=utf8" />. Okazuje się, że dosłownie niemożliwe jest ustawienie dwóch właściwości connectionProperties w jednym komponencie bean, ponieważ ... nie ma nigdzie żadnego znaku separującego (komponent bean spróbuje odczytać go jako próbę ustawienia yes;characterEncoding=utf8 jako wartość useUnicode). Moje pytanie brzmi: jak mam utf8?

+0

Być może potrzebujesz również średnika po 'characterEncoding = utf8', jak wspomniano tutaj: http://stackoverflow.com/questions/13359683/how-to-use-useunicode-yes-characterencoding-utf-8-with- dbcp – GriffeyDog

+0

@GriffeyDog Umieszczam tam średnik, nie kopiowałem go z kodu. Nie pozwoli mi się skompilować bez jednego (no cóż, będzie - ale wkrótce dostanę wyjątek). –

Odpowiedz

23

problem może być spowodowany przez określenie utf8 a nie UTF-8. Od Using Character Sets and Unicode:

Podczas określania kodowania znaków po stronie klienta należy użyć nazw w stylu Java. Poniższa tabela zawiera MySQL zestawu znaków nazwy i odpowiednie nazwy Java stylu ...

i utf8 map do UTF-8. Spróbuj następującą JDBC URL:

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

+0

to działa, dziękuję. – egemen

5

Czy spróbować:

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

A także: Czy spróbować prostego klienta Java (Console Application), która łączy się z DB? Czy UTF-8 działa w tym przypadku?

+0

Próbowałem twojego rozwiązania właśnie teraz, bez skutku. Dla prostej aplikacji konsolowej - jeszcze jej nie mam. Ja wkrótce. –

+0

Czy mógłbyś dokładniej opisać błędy (jeśli występują) w konfiguracji? Również, który komponent bean skonfigurowałeś? ('') –

+0

Nie ma żadnych błędów, to jeden z problemów! Jedyne, co otrzymuję, to gdy próbuję określić jedną wartość właściwości. Jak opisano powyżej. I konfiguruję komponent bean, który nazwałem źródłem danych, z klasą 'org.springframework.jdbc.datasource.DriverManagerDataSource', oraz właściwościami opisanymi powyżej. –

4

Zauważ, że jeśli używasz Wiosna Boot, można zrobić to przy użyciu właściwości w ramach application.properties zamiast konieczności dodawania dodatkowych parametrów do ciągów połączenia:

Umieść to w aplikacji.Właściwości:

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

Dziękuję. To najlepsza odpowiedź ze wszystkich. Mam Spring JPA; Hibernacja i osadzanie H2 db i za każdym razem, gdy jest ładowany z import.sql, kodowanie zostało pomieszane. – Kefirchiks

+0

To nie działa dla mnie i jestem ciekawy, jak to może działać dla kogoś innego. Oficjalna dokumentacja również nie wspomina o niej na liście możliwych parametrów: https://docs.spring.io/spring-boot/docs/1.5.x/reference/html/common-application-properties.html –

+0

Ta właściwość nie istnieje już w Spring Boot 1.4 i wyżej. Zobacz https://stackoverflow.com/questions/40250678/set-jpa-utf-8-encoding-in-application-perties_40255073#40255073 –

2

miałem ten sam problem podczas używania Spring-bagażnik + wbudowany H2 + Hibernate, ale problem był w momencie czytania skryptu SQL. (data.sql) Kodowanie w bazie danych zostało zerwane za każdym razem, gdy czytałem jakąkolwiek obcą postać.

dodając następującą linię do moich application.properties rozwiązał problem:

spring.datasource.sqlScriptEncoding=UTF-8

Jeśli jest to możliwe, przejdź do konsoli i dodać jakieś dane ręcznie. Jeśli obce znaki pojawią się we właściwy sposób. Wtedy to rozwiązanie może działać dobrze dla ciebie.

I odkryli, że rozwiązanie tutaj:

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

+0

to działało dla mnie –

0

zmarnowałem czasu, aby wygenerować UTF-8 stołów. Nie dla powyższego działało dla mnie. W końcu zmieniłem mój plik konfiguracyjny mysql & działa jak urok. Jeśli jesteś w Linuksie (jestem w Ubuntu, jestem pewien, że jest plik dla Windows) otwórz plik /etc/mysql/my.cnf i dodaj następujący kod.

[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 

Nie zapomnij ponownie uruchomić usługi mysql.