Должен ли я использовать JDBC getNString () вместо getString ()? - PullRequest
12 голосов
/ 05 мая 2011

Мы создаем приложение Java, поддерживаемое базой данных Oracle, доступ к которой осуществляется с помощью JDBC (драйверы ojdbc6.jar и orai18n.jar). Схема базы данных хранит текстовые столбцы в основном с использованием типа данных NVARCHAR2.

В документации JDBC для JDBC ResultSet говорится, что getNString() специально предназначен для использования с типами данных NCHAR, NVARCHAR и т. Д., Но на данный момент мы используем только getString().

Кажется, это работает нормально, поэтому мне интересно, почему я должен использовать getNString() вместо getString(). Будет ли getString() давать сбой, если будут введены не-ASCII-символы, или драйвер Oracle JDBC безразлично, какой метод мне следует использовать?

РЕДАКТИРОВАТЬ: кажется, что это может зависеть от базы данных: SQL Server, кажется, не против того, что вы используете , в зависимости от параметров подключения. У кого-нибудь есть какая-то конкретная информация об Oracle?

Ответы [ 2 ]

7 голосов
/ 22 июня 2011

Я провел тест нашего приложения, и кажется, что getNString() не требуется с драйверами Java 6, JDBC 6, Oracle JDBC 6 и Oracle 11.1.0.6.0.Я использовал тестовую строку «Δ, Й, ק, م, ๗, あ, 叶, 葉 и 말», скопированную из http://en.wikipedia.org/wiki/Unicode.

Большая часть нашего доступа к данным осуществляется через хранимые процедуры.Java смогла правильно установить и извлечь вышеуказанную тестовую строку с помощью setObject() и getString() (не setString() по соображениям абстракции), собирая данные из интерфейса и записывая их обратно в интерфейс, как и ожидалось.

Следовательно, getString() работает нормально для данных Unicode с Oracle 11g (например, SQL Server, как в приведенной выше ссылке), поэтому мы продолжим использовать это вместо getNString().

2 голосов
/ 05 мая 2011

Если ваша БД использует тип данных NVARCHAR2, она предназначена для хранения многоязычных данных. Ваша программа сломается, если в этих столбцах будут храниться данные Юникода. На вашем месте я бы перешел на getNXXX() методы

...