2011-05-05 12 views
12

Budujemy aplikację Java wspieraną przez bazę danych Oracle, do której uzyskujemy dostęp za pomocą JDBC (sterowniki ojdbc6.jar i orai18n.jar). Schemat bazy danych przechowuje kolumny tekstowe przede wszystkim przy użyciu typu danych NVARCHAR2.Czy powinienem używać JDBC getNString() zamiast getString()?

JDBC documentation dla JDBC ResultSet mówi, że getNString() przeznaczony jest szczególnie do użytku z nchar, nvarchar itp typów danych, ale w tej chwili używamy tylko getString().

To działa dobrze, więc zastanawiam się, dlaczego powinienem użyć getNString() zamiast getString(). Czy w przypadku wprowadzenia znaków spoza zestawu ASCII rozpocznie się niepowodzenie, czy też sterownik JDBC Oracle jest obojętny, do jakiej metody powinienem użyć?

EDYCJA: Wydaje się, że może zależeć od bazy danych: SQL Server doesn't seem to mind which you use, w zależności od parametrów połączenia. Czy ktoś ma jakieś konkretne informacje na temat Oracle?

Odpowiedz

7

Zrobiłem test w naszej aplikacji i wydaje się, że jest niepotrzebny getNString() z Java 6, 6 JDBC Oracle JDBC 6 kierowców i Oracle 11.1.0.6.0 . Ciąg testowy, którego użyłem to "Δ, Й, ק, م, 7, あ, 叶, 葉 i 말", skopiowany z http://en.wikipedia.org/wiki/Unicode.

Większość naszego dostępu do danych odbywa się za pomocą procedur przechowywanych. Java była w stanie ustawić i pobrać powyższy ciąg testowy poprawnie przez setObject() i getString() (nie setString() z powodów abstrakcji), zbierając dane z interfejsu i zapisując je z powrotem do interfejsu zgodnie z oczekiwaniami.

Dlatego getString() działa dobrze dla danych Unicode z Oracle 11g (jak SQL Server, jak w powyższym linku), więc będziemy nadal używać tego zamiast getNString().

+2

Proponuję dodać ten test do twojego zestawu regresji, na wypadek gdyby zmiany w przyszłych wersjach Oracle lub Java – artbristol

+0

@artbristol - to bardzo dobry pomysł. Nawet zmiana w konfiguracji Oracle może potencjalnie spowodować regresję (chociaż nie mam powodu, aby wierzyć, że oprócz doświadczenia z konfiguracją Oracle) – Gnat

2

Jeśli twoja baza danych wykorzystuje typ danych NVARCHAR2, jest przeznaczona do przechowywania danych wielojęzycznych. Twój program ulegnie zerwaniu, jeśli w tych kolumnach będą przechowywane dane Unicode. Gdybym był tobą, chciałbym przenieść nad do getNXXX() metod

Powiązane problemy