Should I be using JDBC getNString() instead of getString()?

14,824

Solution 1

I have done a test on our application and it seems that getNString() is unnecessary with Java 6, JDBC 6, Oracle JDBC 6 drivers and Oracle 11.1.0.6.0. The test string I used was "Δ, Й, ק, ‎ م, ๗, あ, 叶, 葉, and 말", copied from http://en.wikipedia.org/wiki/Unicode.

Most of our data access is done via stored procedures. Java was able to set and retrieve the above test string correctly via setObject() and getString() (not setString() for abstraction reasons), collecting data from the interface and writing it back to the interface as expected.

Hence getString() works ok for Unicode data with Oracle 11g (like SQL Server as in the above link) so we will continue to use this rather than getNString().

Solution 2

If your DB uses the NVARCHAR2 datatype, it is designed to be storing multilingual data. Your program will break if any unicode data is stored in those columns. If I were you, I would move over to the getNXXX() methods

Share:
14,824
Gnat
Author by

Gnat

Updated on July 10, 2022

Comments

  • Gnat
    Gnat almost 2 years

    We are building a Java application backed by an Oracle database that we access using JDBC (drivers ojdbc6.jar and orai18n.jar). The database schema stores text columns primarily using the NVARCHAR2 data type.

    The JDBC documentation for the JDBC ResultSet says that getNString() is particularly intended for use with the NCHAR, NVARCHAR etc. data types, but at the moment we are only using getString().

    This seems to work fine, so I am wondering why I should use getNString() rather than getString(). Is getString() going to start failing if non-ASCII characters are entered, or is the Oracle JDBC driver indifferent as to which method I should use?

    EDIT: Seems that it may be database-dependent: SQL Server doesn't seem to mind which you use, depending on the connection parameters. Does anyone have any specific information on Oracle?

  • artbristol
    artbristol about 13 years
    I suggest you add that test to your regression suite in case it changes in future versions of Oracle or Java
  • Gnat
    Gnat about 13 years
    @artbristol - that's a very good idea. Even a change in Oracle configuration could potentially cause a regression (although I have no reason to believe that except for experience with Oracle configuration)
  • nomadSK25
    nomadSK25 about 4 years
    this is a sign of poorly designed API by Java.
  • Mert Serimer
    Mert Serimer over 3 years
    You can not getNString on varchar column in sql server. So there is no global solution. oracle java driver handles nvarchar - varchar conversion but mssql driver does not