Irek Słonina

Irek Słonina programowanie, bazy
danych i linuksy

Temat: 11.1.0.7 + database gateway (dg4msql) i null char co...

Witam,

Po mojej stronie: 11.1.0.7 SE + Db gateway dla SQL Server
Po drugiej stronie: MS SQL Server 2005 SE

Po konfiguracji gatewaya mam komunikację tylko otrzymuję głupie dane.

Typ kolumny po stronie MSSQL: NVARCHAR(20)

Typ kolumny wg Oracle'a: VARCHAR2(20 CHAR)
(w ogóle co to za głupawy typ? czym się różni od VARCHAR2(20)?)

select name, dump(name) FROM widok@dg4sql;

Po stronie MSSQL jest name = 'testowy'
Po stronie Oracle'a dostaje: '\0t\0e\0s\0t\0o\0w\0y'
dump(name): Typ=1 Len=14: 0,116,0,101,0,115,0,116,0,111,0,119,0,121

initdg4msql.ora nie jest specjalnie ciekawy:

HS_FDS_CONNECT_INFO=666.666.666.666:1433//Baza
HS_FDS_TRACE_LEVEL=OFF
HS_FDS_RECOVERY_ACCOUNT=RECOVER
HS_FDS_RECOVERY_PWD=RECOVER


Jestem całkowicie zielony jeśli chodzi o gatewaye więc wszelkie sugestie mile widziane.

Temat: 11.1.0.7 + database gateway (dg4msql) i null char co...

Witam,
Sugestia nr 1 :) Wprawdzie dla 9i ale zawsze coś.

LinkPaweł Dzierżak edytował(a) ten post dnia 23.02.10 o godzinie 09:35
Irek Słonina

Irek Słonina programowanie, bazy
danych i linuksy

Temat: 11.1.0.7 + database gateway (dg4msql) i null char co...

Paweł Dzierżak:
Witam,
Sugestia nr 1 :) Wprawdzie dla 9i ale zawsze coś.

Link

Dzięki!
Przynajmniej wiem o co chodzi z tymi dziwnymi typami.
Zmiana nls_length_semantics na CHAR rzeczywiście pokazuje poprawne typy kolumn czyli VARCHAR2(20).
Nie zmienia to jednak tego, że dump() dalej pokazuje każdy znak poprzedzony \0.

Dziwna sprawa, że to daje dobry wynik (bez \0):
a) SELECT CAST(name AS VARCHAR(20)) FROM widok@dg4msql;

to daje zły wynik z \0 (zarówno w dump(name), jak i name)
b) SELECT dump(name), name FROM widok@dg4msql;

a to wypieprza połączenie JDBC (java.sql.SQLException: Bigger type length than Maximum), zarówno w aplikacji klienckiej jaki SQL Developerze:
c) SELECT name FROM widok@dg4msql;

i to wypieprzanie c) jest dla mnie największym problemem. Zmiana nls_length_semantics na CHAR nie zmienia wyniku powyższych zapytań.
Zgaduję, że wypieprzanie jest spowodowane tym, że Oracle mówi, że daje do 20 znaków, a razem z \0 daje tak naprawdę dwa razy więcej.

Sprawdzałem z ciekawości na 11R2 i zachowanie jest identyczne więc nie bug, a pewnie coś niedokonfigurowanie z mojej strony.Irek Słonina edytował(a) ten post dnia 23.02.10 o godzinie 12:40
Tomasz Kania

Tomasz Kania DBA, SoftSystem Sp.
z o.o.

Temat: 11.1.0.7 + database gateway (dg4msql) i null char co...

Wydaje się, że to może być jakiś problem z konwersją (inna strona kodowa po stronie MSSQL'a?).
Coś bym próbował kombinować z HS_LANGUAGE i HS_NLS_NCHAR.Tomasz Kania edytował(a) ten post dnia 23.02.10 o godzinie 21:03

Temat: 11.1.0.7 + database gateway (dg4msql) i null char co...

Jak wyglądają polskie znaki po stronie Oracle'a?
Założe się, że mają jednak pierwszy bajt wypełniony. Stawiam na to, że jest to UTF-16.
Irek Słonina

Irek Słonina programowanie, bazy
danych i linuksy

Temat: 11.1.0.7 + database gateway (dg4msql) i null char co...

Rzeczywiście wygląda na jakiś problem z kodowaniem.
Zapisane po stronie MSSQL: ąćęłńóśźżĄĆĘŁŃÓŚŹŻ
Wynik dump() po stronie Oracle'a: 1,5,1,7,1,25,1,66,1,68,0,243,1,91,1,122,1,124,1,4,1,6,1,24,1,65,1,67,0,211,1,90,1,121,1,123
CAST(name AS VARCHAR(20)) daje poprawne polskie znaki z JDBC.

1,5,1,7,1,25,1,66,1,68,0,243,1,91,1,122,1,124,1,4,1,6,1,24,1,65,1,67,0,211,1,90,1,121,1,123
Wygląda na rozbity 8-bitowy znak. Nie odpowiada jednak żadnej znanej notacji na http://pl.wikipedia.org/wiki/Kodowanie_polskich_znak%C...

Próbowałem takich opcji (które podobno zamieniają dwubajtowe kodowania na jednobajtowe i z powrotem) ale bez sukcesów (nie zmienia reprezentacji znaków wg dump()):
DRDA_GRAPHIC_TO_MBCS=TRUE
DRDA_GRAPHIC_LIT_CHECK=TRUE
DRDA_MBCS_TO_GRAPHIC=TRUE

Odnośnie HS_LANGUAGE
HS_LANGUAGE=POLAND_POLISH.EE8ISO8859P2
HS_LANGUAGE=POLAND_POLISH.EE8MSWIN1250
czy nawet
HS_LANGUAGE=POLAND_POLISH.WE8ISO8859P1
HS_LANGUAGE=AMERICAN_AMERICA.WE8ISO8859P1

nie zmieniają zachowania (dalej dwa bajty)

Odnośnie HS_NLS_NCHAR:
HS_LANGUAGE=POLAND_POLISH.EE8ISO8859P2
HS_NLS_NCHAR=EE8ISO8859P2
(jak wskazuje dokumentacja - mają być identyczne)

Robi bezużyteczne połączenie, w trace'ach pakując:
Exiting hgolgon, rc=28513 at 2010/02/24-07:45:18 with error ptr FILE:hgolgon.c L
INE:161 FUNCTION:hgolgon() ID:Getting unicode encoding

Czyli jest jakiś unikod.

HS_LANGUAGE=POLAND_POLISH.UTF8
HS_NLS_NCHAR=UTF8
dalej dają dwa bajty w dump()
Próbowane dodatkowo AL32UTF8, AL16UTF16, UTFE - nic to nie zmienia.

------
Collation na MSSQL to Polish_CI_AS.

Otworzyłem sobie SR'a, może coś mądrale wymyślą.
Piotr Czeczko

Piotr Czeczko Technical Director

Temat: 11.1.0.7 + database gateway (dg4msql) i null char co...

Sprawdz moze na bazie (oracle) dla Twojej sesji jakie masz ustawienia (nls_session_parameters).
Acha i jeszcze jedno metody ustawiania nls sa priorytwetyzowane:
1. biezaca funkcja
2. biezaca sesja (alter session)
3. biezaca sessja (zmienne srodowiskowe)
4. instancja (ustawienia dla parametrow inicjalizacyjnych)
5. instancja (ustawienia na poziomie bazy)

Poza tym sprobuj z poziomu systemu uzyc zmiennej NLS_LANG.

Moze pomoze ...

Pozdrawiam
Piotrek

Temat: 11.1.0.7 + database gateway (dg4msql) i null char co...

Irek Słonina:

Otworzyłem sobie SR'a, może coś mądrale wymyślą.


Czesc,

Oba systemy sa 64 bitowe ? a drivery tez ?

pozdrawiam,
Marcin
Irek Słonina

Irek Słonina programowanie, bazy
danych i linuksy

Temat: 11.1.0.7 + database gateway (dg4msql) i null char co...

Przestałem chwilowo traktować to priorytetowo więc trochę mi zeszło z odpowiedzią, mam nadzieję, że osoby zainteresowane mi to wybaczą :-P

Problem na chwilę obecną nie jest rozwiązany ale ludź z Oracle'a odtworzył u siebie problem i nad nim ciężko pracuje więc jestem dobrej myśli.

NLS_LANG pomaga - np. po ustawieniu w American_America.UTF8 dostaje piękne polskie krzaki w UTF'ie. Ale pomaga tylko dla sqlplusa.
JDBC nie korzysta z NLS_LANG.
Ustawienia bazy też niewiele mają z tym wspólnego - ustawienie jej w AL32UTF8 bez prezentacji w EE8ISO8859P2 nie zmienia zachowania sterowników JDBC (dalej się wypieprza).

Architektura systemu Oracle'owego jest 64bitowa. MSSQL był na maszynie 32bitowej. W tej chwili MSSQL jest na maszynie 64bitowej (nie znam szczegółów, nie wiem czy system/rdbms też jest w wersji 64bitowej).
Sterowniki JDBC nie posiadają zależności dotyczącej architektury.
Java na aplikacjach klienckich jest czasem 64 bitowa, czasem 32 bitowa ale to nie zmienia w żaden sposób objawów.

Prawdopodobnie problem powinien zostać inaczej zdefiniowany - dwa bajty reprezentujące jeden znak nie jest problemem, ponieważ mimo tego sqlplus wyświetla mimo to poprawne polskie znaki. Nie jest to też przypadłość gateway'a mssql'owego, a definicji typu tabeli (VARCHAR(20 char)).

Wracając do JDBC... prawdopodobnie wspomniane zachowanie (java.sql.SQLException: Bigger type length than Maximum) spowodowane jest bugiem 6522392, który podobno jest poprawiony w 11.2 wersji drivera JDBC ale ten z kolei wypieprza się w inny sposób (java.lang.OutOfMemoryError: Java heap space) ale liczę w tej kwestii na człowieka z supportu.Irek Słonina edytował(a) ten post dnia 07.03.10 o godzinie 15:42

Temat: 11.1.0.7 + database gateway (dg4msql) i null char co...

NLS_LANG pomaga - np. po ustawieniu w American_America.UTF8 dostaje piękne polskie krzaki w UTF'ie. Ale pomaga tylko dla sqlplusa.
JDBC nie korzysta z NLS_LANG.
A z czego? Chyba jakoś da się powiedzieć Oracle'owi jaki jest character set klienta jdbc? Czy zawsze ustawia że Unicode na starcie?
Irek Słonina

Irek Słonina programowanie, bazy
danych i linuksy

Temat: 11.1.0.7 + database gateway (dg4msql) i null char co...

Jacek Tomaka:
NLS_LANG pomaga - np. po ustawieniu w American_America.UTF8 dostaje piękne polskie krzaki w UTF'ie. Ale pomaga tylko dla sqlplusa.
JDBC nie korzysta z NLS_LANG.
A z czego? Chyba jakoś da się powiedzieć Oracle'owi jaki jest character set klienta jdbc? Czy zawsze ustawia że Unicode na starcie?

JDBC korzysta ze zwykłych localesów, konkretnie z LANG.
Zdarzenie zostało zakwalifikowane jako bug w gateway'ach, czekam na rozwiązanie.

konto usunięte

Temat: 11.1.0.7 + database gateway (dg4msql) i null char co...

Spróbuj przy inithsodbc.ora
HS_FDS_CONNECT_INFO = XXX-YYY-ZZZ
HS_FDS_TRACE_LEVEL = DEBUG
HS_FDS_TRACE_FILE_NAME = /tmp/hsodbc.trc
set LANG=pl_PL.ISO-8859-2
set NLS_LANG=POLISH_POLAND.EE8ISO8859P2
HS_LANGUAGE=POLISH_POLAND.EE8ISO8859P2

Na widokach SYS.V_$HS_* masz dokładnie to co baza "WIDZI" a plik trace prawdę Ci powie.

konto usunięte

Temat: 11.1.0.7 + database gateway (dg4msql) i null char co...

Aha ... jesli to rozwiązanie sie nie sprawdza czasem warto spróbować czegoś innego ... darmowego ale działającego np. UnixODBC+FreeTDS.
Sprawdzone na RED-HAT EL5, 10G-R2 64bit, SQL Server 2000 Enterprise
Mateusz Kurnyta

Mateusz Kurnyta Oracle Database
Administrator,
EKO-OKNA S.A.

Temat: 11.1.0.7 + database gateway (dg4msql) i null char co...

Po długich próbach udało mi się w końcu rozwiązać problem.
Ważne by na getewayu oraclowym (w moim przypadku Windows)
w rejestrze systemowym windows w drzewie oracle był wpis dword NS_LANG dla języka polskiego jak również w pliku initMSSQL.ora również wpis z langiem polskim.
POLISH_POLAND.EE8MSWIN1250

Następna dyskusja:

Antywzorce programisty baz ...




Wyślij zaproszenie do