Stroring internationalized strings in Oracle9i with OJB

2005-07-28 Thread Guillaume Laforge
Hello,

On my current project, I'm using Oracle9i and OJB. The version of OJB
is rather old: that's 1.0.0, but I may and will certainly upgrade to
1.0.3 if that's needed.

I'm storing sentences in 40 different languages (English, French,
Japanese, Chinese, etc...).

All the columns of my tables which are supposed to be holding some
i18n content are of type NVARCHAR2 or NCHAR -- i.e. I'm using
Oracle9i's specific types for storing Unicode characters.

My problem is that when I try to store and then retrieve labels with
non-latin characters, I don't get the same string. In fact, the label
is badly stored in the database, and badly encoded.

Hence the question: How can I manage to configure OJB, or perhaps my
datasource, or my mapping, to make OJB store java Unicode strings
correctly?

Brian told me there may be some specific means for altering all
statements for a give data type. Is there some documentation somewhere
I could read? Oracle allows to use a specific pstmt.setFormOfUse(1,
OraclePreparedStatement.FORM_NCHAR) which is an extension to JDBC
unfortunately.

To give some more background, here are some more specific details on
my Oracle9i configuration:

SQL select * from nls_database_parameters;

PARAMETER   VALUE
--  --
NLS_LANGUAGEFRENCH
NLS_TERRITORY   FRANCE
NLS_CURRENCY? (ca doit être le caractère euro, mais le DOS ne le
supporte pas à l'affichage)
NLS_ISO_CURRENCYFRANCE
NLS_NUMERIC_CHARACTERS ,.
NLS_CHARACTERSETWE8ISO8859P15
NLS_CALENDARGREGORIAN
NLS_DATE_FORMAT DD/MM/
NLS_DATE_LANGUAGE   FRENCH
NLS_SORTFRENCH
NLS_TIME_FORMAT HH24:MI:SSXFF

PARAMETER   VALUE
--  --
NLS_TIMESTAMP_FORMATDD/MM/RR HH24:MI:SSXFF
NLS_TIME_TZ_FORMAT  HH24:MI:SSXFF TZR
NLS_TIMESTAMP_TZ_FORMAT DD/MM/RR HH24:MI:SSXFF TZR
NLS_DUAL_CURRENCY   ? (encore le caractère euro)
NLS_COMPBINARY
NLS_LENGTH_SEMANTICSBYTE
NLS_NCHAR_CONV_EXCP FALSE
NLS_NCHAR_CHARACTERSET  AL16UTF16
NLS_RDBMS_VERSION   9.2.0.4.0

As you can see, my default encoding is the same as the system it's
installed on, and it's by default WE8ISO8859P15. And with that default
charset, Oracle treats all String inserts as if the String was a local
String using this encoding, though the NCHAR type has a 16-bit Unicode
charset.

Oracle9i provides a way to specifically tell the JDBC driver to encode
a String as a Unicode string for the Unicode data types (NCLOB, NCHAR,
NVARCHAR2), and you can do something like:

PreparedStatement statementInsert = cnx.prepareStatement(query);
((OraclePreparedStatement)statementInsert).setFormOfUse(1,
OraclePreparedStatement.FORM_NCHAR);

This solution works, and I can store and retrieve Unicode content.
But obviously, that's not very clean... especially because it uses a
specific Oracle method on its specific implementation of
PreparedStatement.
But well, if that works in JDBC, perhaps there could be a way to do
that with OJB? Some configuration / customisation?

Has anyone encountered that problem and workarounded that it?

Thanks in advance for all the tips or potential solutions.

-- 
Guillaume Laforge
http://glaforge.free.fr/weblog/?catid=2

-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Re: Stroring internationalized strings in Oracle9i with OJB

2005-07-28 Thread Guillaume Laforge
I forgot to mention that I'm using Oracle9i's thin driver and its ojdbc14.jar.
With a version 9.2.0.4 of Oracle9i.


On 28/07/05, Guillaume Laforge [EMAIL PROTECTED] wrote:
 Hello,
 
 On my current project, I'm using Oracle9i and OJB. The version of OJB
 is rather old: that's 1.0.0, but I may and will certainly upgrade to
 1.0.3 if that's needed.
 
 I'm storing sentences in 40 different languages (English, French,
 Japanese, Chinese, etc...).
 
 All the columns of my tables which are supposed to be holding some
 i18n content are of type NVARCHAR2 or NCHAR -- i.e. I'm using
 Oracle9i's specific types for storing Unicode characters.
 
 My problem is that when I try to store and then retrieve labels with
 non-latin characters, I don't get the same string. In fact, the label
 is badly stored in the database, and badly encoded.
 
 Hence the question: How can I manage to configure OJB, or perhaps my
 datasource, or my mapping, to make OJB store java Unicode strings
 correctly?
 
 Brian told me there may be some specific means for altering all
 statements for a give data type. Is there some documentation somewhere
 I could read? Oracle allows to use a specific pstmt.setFormOfUse(1,
 OraclePreparedStatement.FORM_NCHAR) which is an extension to JDBC
 unfortunately.
 
 To give some more background, here are some more specific details on
 my Oracle9i configuration:
 
 SQL select * from nls_database_parameters;
 
 PARAMETER   VALUE
 --  --
 NLS_LANGUAGEFRENCH
 NLS_TERRITORY   FRANCE
 NLS_CURRENCY? (ca doit être le caractère euro, mais le DOS ne le
 supporte pas à l'affichage)
 NLS_ISO_CURRENCYFRANCE
 NLS_NUMERIC_CHARACTERS ,.
 NLS_CHARACTERSETWE8ISO8859P15
 NLS_CALENDARGREGORIAN
 NLS_DATE_FORMAT DD/MM/
 NLS_DATE_LANGUAGE   FRENCH
 NLS_SORTFRENCH
 NLS_TIME_FORMAT HH24:MI:SSXFF
 
 PARAMETER   VALUE
 --  --
 NLS_TIMESTAMP_FORMATDD/MM/RR HH24:MI:SSXFF
 NLS_TIME_TZ_FORMAT  HH24:MI:SSXFF TZR
 NLS_TIMESTAMP_TZ_FORMAT DD/MM/RR HH24:MI:SSXFF TZR
 NLS_DUAL_CURRENCY   ? (encore le caractère euro)
 NLS_COMPBINARY
 NLS_LENGTH_SEMANTICSBYTE
 NLS_NCHAR_CONV_EXCP FALSE
 NLS_NCHAR_CHARACTERSET  AL16UTF16
 NLS_RDBMS_VERSION   9.2.0.4.0
 
 As you can see, my default encoding is the same as the system it's
 installed on, and it's by default WE8ISO8859P15. And with that default
 charset, Oracle treats all String inserts as if the String was a local
 String using this encoding, though the NCHAR type has a 16-bit Unicode
 charset.
 
 Oracle9i provides a way to specifically tell the JDBC driver to encode
 a String as a Unicode string for the Unicode data types (NCLOB, NCHAR,
 NVARCHAR2), and you can do something like:
 
 PreparedStatement statementInsert = cnx.prepareStatement(query);
 ((OraclePreparedStatement)statementInsert).setFormOfUse(1,
 OraclePreparedStatement.FORM_NCHAR);
 
 This solution works, and I can store and retrieve Unicode content.
 But obviously, that's not very clean... especially because it uses a
 specific Oracle method on its specific implementation of
 PreparedStatement.
 But well, if that works in JDBC, perhaps there could be a way to do
 that with OJB? Some configuration / customisation?
 
 Has anyone encountered that problem and workarounded that it?
 
 Thanks in advance for all the tips or potential solutions.



-- 
Guillaume Laforge
http://glaforge.free.fr/weblog/?catid=2

-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Re: Stroring internationalized strings in Oracle9i with OJB

2005-07-28 Thread Bobby Lawrence

Guillaume -
I don't think OJB has any connection-specific configuration, but you can 
try this code on your insert:


ClassDescriptor classDescriptor = broker.getClassDescriptor(YourClass.class);
PreparedStatement statementInsert = 
broker.serviceStatementManager().getInsertStatement(classDescriptor);
((OraclePreparedStatement)statementInsert).setFormOfUse(1, 
OraclePreparedStatement.FORM_NCHAR);
broker.serviceStatementManager().bindInsert(statementInsert , classDescriptor, 
yourObject);
broker.store(yourObject);

Obviously, you can change it slightly for an update.
--Bobby


Guillaume Laforge wrote:


I forgot to mention that I'm using Oracle9i's thin driver and its ojdbc14.jar.
With a version 9.2.0.4 of Oracle9i.


On 28/07/05, Guillaume Laforge [EMAIL PROTECTED] wrote:
 


Hello,

On my current project, I'm using Oracle9i and OJB. The version of OJB
is rather old: that's 1.0.0, but I may and will certainly upgrade to
1.0.3 if that's needed.

I'm storing sentences in 40 different languages (English, French,
Japanese, Chinese, etc...).

All the columns of my tables which are supposed to be holding some
i18n content are of type NVARCHAR2 or NCHAR -- i.e. I'm using
Oracle9i's specific types for storing Unicode characters.

My problem is that when I try to store and then retrieve labels with
non-latin characters, I don't get the same string. In fact, the label
is badly stored in the database, and badly encoded.

Hence the question: How can I manage to configure OJB, or perhaps my
datasource, or my mapping, to make OJB store java Unicode strings
correctly?

Brian told me there may be some specific means for altering all
statements for a give data type. Is there some documentation somewhere
I could read? Oracle allows to use a specific pstmt.setFormOfUse(1,
OraclePreparedStatement.FORM_NCHAR) which is an extension to JDBC
unfortunately.

To give some more background, here are some more specific details on
my Oracle9i configuration:

SQL select * from nls_database_parameters;

PARAMETER   VALUE
--  --
NLS_LANGUAGEFRENCH
NLS_TERRITORY   FRANCE
NLS_CURRENCY? (ca doit être le caractère euro, mais le DOS ne le
supporte pas à l'affichage)
NLS_ISO_CURRENCYFRANCE
NLS_NUMERIC_CHARACTERS ,.
NLS_CHARACTERSETWE8ISO8859P15
NLS_CALENDARGREGORIAN
NLS_DATE_FORMAT DD/MM/
NLS_DATE_LANGUAGE   FRENCH
NLS_SORTFRENCH
NLS_TIME_FORMAT HH24:MI:SSXFF

PARAMETER   VALUE
--  --
NLS_TIMESTAMP_FORMATDD/MM/RR HH24:MI:SSXFF
NLS_TIME_TZ_FORMAT  HH24:MI:SSXFF TZR
NLS_TIMESTAMP_TZ_FORMAT DD/MM/RR HH24:MI:SSXFF TZR
NLS_DUAL_CURRENCY   ? (encore le caractère euro)
NLS_COMPBINARY
NLS_LENGTH_SEMANTICSBYTE
NLS_NCHAR_CONV_EXCP FALSE
NLS_NCHAR_CHARACTERSET  AL16UTF16
NLS_RDBMS_VERSION   9.2.0.4.0

As you can see, my default encoding is the same as the system it's
installed on, and it's by default WE8ISO8859P15. And with that default
charset, Oracle treats all String inserts as if the String was a local
String using this encoding, though the NCHAR type has a 16-bit Unicode
charset.

Oracle9i provides a way to specifically tell the JDBC driver to encode
a String as a Unicode string for the Unicode data types (NCLOB, NCHAR,
NVARCHAR2), and you can do something like:

PreparedStatement statementInsert = cnx.prepareStatement(query);
((OraclePreparedStatement)statementInsert).setFormOfUse(1,
OraclePreparedStatement.FORM_NCHAR);

This solution works, and I can store and retrieve Unicode content.
But obviously, that's not very clean... especially because it uses a
specific Oracle method on its specific implementation of
PreparedStatement.
But well, if that works in JDBC, perhaps there could be a way to do
that with OJB? Some configuration / customisation?

Has anyone encountered that problem and workarounded that it?

Thanks in advance for all the tips or potential solutions.
   





 



--

Bobby Lawrence
MIS Application Developer

Jefferson Lab (www.jlab.org)

Email: [EMAIL PROTECTED]
Office: (757) 269-5818
Pager: (757) 584-5818