From: George K. on
Hello all,

Let me start by saying that I am new to Oracle so please excuse my
ignorance.

I have this problem whereby when I insert any characters from the the
ASCII character set with code >= 127 Oracle seems to change its
representation to a '?'--so when I select the data from either sqlplus
or my program (perl using DBI) I do not get the same data I stored.

My test table definition is as follows and I have tried this with both
nvarchar2 and varchar2 with the same result.
create table tester ( tester_id NUMBER(19,0) not null, tester_data
varchar2(2000));

Here's my NLS_DATABASE_PARAMETERS table for your benefit:

PARAMETER VALUE
----------------------- ----------------------------
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_CHARACTERSET AL32UTF8
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE AMERICAN
NLS_SORT BINARY
NLS_TIME_FORMAT HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY $
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE

Any ideas will be greatly appreciated.

George
From: ddf on
Comments embedded.

On Apr 20, 1:32 pm, "George K." <kara...(a)gmail.com> wrote:
> Hello all,
>
> Let me start by saying that I am new to Oracle so please excuse my
> ignorance.
>
> I have this problem whereby when I insert any characters from the the
> ASCII character set with code >= 127 Oracle seems to change its
> representation to a '?'--so when I select the data from either sqlplus
> or my program (perl using DBI) I do not get the same data I stored.
>

These inserts are from a client machine I presume. If you do this on
the database server do you see the same behaviour? What are the NLS
settings on the client? This is where your problem orignates, I
expect.

> My test table definition is as follows and I have tried this with both
> nvarchar2 and varchar2 with the same result.
> create table tester ( tester_id NUMBER(19,0) not null, tester_data
> varchar2(2000));
>
> Here's my NLS_DATABASE_PARAMETERS table for your benefit:
>
>  PARAMETER               VALUE
>  ----------------------- ----------------------------
>  NLS_LANGUAGE            AMERICAN
>  NLS_TERRITORY           AMERICA
>  NLS_CURRENCY            $
>  NLS_ISO_CURRENCY        AMERICA
>  NLS_NUMERIC_CHARACTERS  .,
>  NLS_CHARACTERSET        AL32UTF8
>  NLS_CALENDAR            GREGORIAN
>  NLS_DATE_FORMAT         DD-MON-RR
>  NLS_DATE_LANGUAGE       AMERICAN
>  NLS_SORT                BINARY
>  NLS_TIME_FORMAT         HH.MI.SSXFF AM
>  NLS_TIMESTAMP_FORMAT    DD-MON-RR HH.MI.SSXFF AM
>  NLS_NCHAR_CHARACTERSET  AL16UTF16
>  NLS_TIME_TZ_FORMAT      HH.MI.SSXFF AM TZR
>  NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
>  NLS_DUAL_CURRENCY       $
>  NLS_COMP                BINARY
>  NLS_LENGTH_SEMANTICS    BYTE
>  NLS_NCHAR_CONV_EXCP     FALSE
>
> Any ideas will be greatly appreciated.
>
> George

Those are server settings, not the client-side values. Check how
your Oracle client is configured as I expect it's not the same as the
database server and therein lie the problems.


David Fitzjarrell
From: Mark D Powell on
On Apr 20, 1:32 pm, "George K." <kara...(a)gmail.com> wrote:
> Hello all,
>
> Let me start by saying that I am new to Oracle so please excuse my
> ignorance.
>
> I have this problem whereby when I insert any characters from the the
> ASCII character set with code >= 127 Oracle seems to change its
> representation to a '?'--so when I select the data from either sqlplus
> or my program (perl using DBI) I do not get the same data I stored.
>
> My test table definition is as follows and I have tried this with both
> nvarchar2 and varchar2 with the same result.
> create table tester ( tester_id NUMBER(19,0) not null, tester_data
> varchar2(2000));
>
> Here's my NLS_DATABASE_PARAMETERS table for your benefit:
>
>  PARAMETER               VALUE
>  ----------------------- ----------------------------
>  NLS_LANGUAGE            AMERICAN
>  NLS_TERRITORY           AMERICA
>  NLS_CURRENCY            $
>  NLS_ISO_CURRENCY        AMERICA
>  NLS_NUMERIC_CHARACTERS  .,
>  NLS_CHARACTERSET        AL32UTF8
>  NLS_CALENDAR            GREGORIAN
>  NLS_DATE_FORMAT         DD-MON-RR
>  NLS_DATE_LANGUAGE       AMERICAN
>  NLS_SORT                BINARY
>  NLS_TIME_FORMAT         HH.MI.SSXFF AM
>  NLS_TIMESTAMP_FORMAT    DD-MON-RR HH.MI.SSXFF AM
>  NLS_NCHAR_CHARACTERSET  AL16UTF16
>  NLS_TIME_TZ_FORMAT      HH.MI.SSXFF AM TZR
>  NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
>  NLS_DUAL_CURRENCY       $
>  NLS_COMP                BINARY
>  NLS_LENGTH_SEMANTICS    BYTE
>  NLS_NCHAR_CONV_EXCP     FALSE
>
> Any ideas will be greatly appreciated.
>
> George

The database has a characterset as does the client. You might have
the data in the daabase just fine but be unable to display it because
your client character set does not support it.

What is the full database version?
What is the client version?
How did you insert the data?
With what tool are you retrieving it? On what platform?

HTH -- Mark D Powell --
From: George K. on
On Apr 21, 9:40 am, joel garry <joel-ga...(a)home.com> wrote:
> On Apr 21, 6:31 am, "George K." <kara...(a)gmail.com> wrote:
>
>
>
> > Thank you guys, I meant to write a response yesterday once I found the
> > solution but I was too tired :).
>
> > I found reading material about oracle's charsets and I run into all
> > the different NLS options.  Armed with that I was able to determine
> > the connection options I have to setup in Perl in order to match the
> > client with the server.
>
> > Here are a few more details on the problem:
> > 1) I am reading from an Informix table containing zlib compressed data
> > stored in a lvarchar.
> > 2) I need to store them in a mirror image table without losing
> > integrity of the data because I can no longer un-compress them.
>
> > The solution was finding an appropriate charset that will not messup
> > the compressed data, I was only able to achive this with the
> > WE8ISO8859P9 charset and here's how I used it:
>
> >   my $dbhOracle = DBI->connect('dbi:Oracle:'.$dbname,$user,$password,
> >                       {
> >                         'RaiseError' => 0,
> >                         'AutoCommit' => 0,
> >                         'PrintError' => 0,
> >                         'ora_charset'=> 'WE8ISO8859P9',
> >                       })
> >     || Carp::croak(DBI->errstr);
>
> > Thank you again for your help, much appreciated.
>
> > George
>
> I'm not sure if this is an issue for you, but there's a possibility
> any time Oracle has to make a character conversion it may do so.  I
> don't recall if there is a P9 to AL32UTF8 issue, but something is
> tickling the back of my brain that there are some obscure issues -
> maybe having to do with the Euro sign?  I know I've seen docs about
> it, just can't remember the details.  If you are relying on no
> translation or strict supersets to do what you want (ie, nothing) with
> binary data, you might have obscure intermittent problems.  See the
> docs or google about the csscan utility, you can use it to see if your
> existing data is susceptible.  But perhaps it isn't existing data you
> have to worry about.  Maybe you can make a quick test of storing all
> characters and using the utility to see.  If you are converting, you
> have to be careful that all tools do the same conversion - this is a
> classic issue with imp/exp.
>
> As far as why Informix can do something Oracle can't... my search for
> lvarchar at ansi.org yielded no results :-)
>
> jg
> --
> @home.com is bogus.http://www.twominutenews.com/2010/technology/apple-earnings-have-incr...

Thanks for the insights and the warning :).
I have actually created such a program, write all characters 0-256 and
retrieve them with no loss of information.
Many thanks again for the responses :).
George
From: George K. on
Thank you guys, I meant to write a response yesterday once I found the
solution but I was too tired :).

I found reading material about oracle's charsets and I run into all
the different NLS options. Armed with that I was able to determine
the connection options I have to setup in Perl in order to match the
client with the server.

Here are a few more details on the problem:
1) I am reading from an Informix table containing zlib compressed data
stored in a lvarchar.
2) I need to store them in a mirror image table without losing
integrity of the data because I can no longer un-compress them.

The solution was finding an appropriate charset that will not messup
the compressed data, I was only able to achive this with the
WE8ISO8859P9 charset and here's how I used it:

my $dbhOracle = DBI->connect('dbi:Oracle:'.$dbname,$user,$password,
{
'RaiseError' => 0,
'AutoCommit' => 0,
'PrintError' => 0,
'ora_charset'=> 'WE8ISO8859P9',
})
|| Carp::croak(DBI->errstr);


Thank you again for your help, much appreciated.

George