Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Konverzija 8859-1 baze u utf8

[es] :: Oracle :: Konverzija 8859-1 baze u utf8

[ Pregleda: 3890 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

sspasic
Sasa Spasic

Član broj: 3261
Poruke: 175
*.medianis.net.

Jabber: sspasic@elitesecurity.org
ICQ: 35454521


Profil

icon Konverzija 8859-1 baze u utf818.05.2005. u 15:51 - pre 229 meseci
Pokušavam da konvertujem bazu sa skupom znakova WE8ISO8859P1 u AL32UTF8.
Na UTF8 bazi je postavljen character semantics
Kreirao sam novu instancu baze i pomocu exporta i importa prebacio sve podatke sem dela slogova iz jedne od tabela koji u originalnoj bazi stoje deklarisani kao varchar2(255) i varchar2(4000), a kada se konvertuju u UTF8 stringovi zauzimaju više od 255, odnosno 4000 bajtova.

Kao da IMP utility ignoriše ovaj character semantics, jer javlja grešku:

IMP-00058: ORACLE error 1461 encountered
ORA-01461: can bind a LONG value only for insert into a LONG column
IMP-00028: partial import of previous table rolled back: 40225 rows rolled back

Naravno da poruka nema veze, jer u tabeli nema long kolona, a kada se uklone problematični slogovi import prolazi.

Zna li neko kako importovati podatke?
 
Odgovor na temu

Raspucin

Moderator
Član broj: 20699
Poruke: 216
212.200.97.*

ICQ: 244452581


+3 Profil

icon Re: Konverzija 8859-1 baze u utf818.05.2005. u 21:46 - pre 229 meseci
Podesi sistemsku promenljivu NLS_LANG na AMERICAN_AMERICA.WE8ISO8859P1
pre nego sto pocnes da radis import podataka. Znaci sistemsku promenljivu, bazu nista ne diraj. Naravno ne moras da podesis da bude AMERICAN_AMERICA, nego podesi da bude isto kao sto je podesavanje na bazama.

$ setenv NLS_LANG AMERICAN_AMERICA.WE8ISO8859P1
ili
c:\>set NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1

inace ovo moze da bude i velika peripetija, ako ovo ne prodje a moralo bi, javi, mada mozes i da kontaktiras JUNIS za podrsku na dato pitanje :-)

Nadam se da ti je ta baza koju treba da importujes na Linux-u, jer za Windows moze da se desi da moras ovu promenljivu da promenis i u Registry-ju. Znaci bitno je da podesis da sistemska promenljiva bude ista kao kod baze. Inace lako mozes da izgubis neki (ili sve) deo podataka.

Pozdrav
 
Odgovor na temu

sspasic
Sasa Spasic

Član broj: 3261
Poruke: 175
*.medianis.net.

Jabber: sspasic@elitesecurity.org
ICQ: 35454521


Profil

icon Re: Konverzija 8859-1 baze u utf819.05.2005. u 07:41 - pre 229 meseci
Ne, nije to problem. To sam postavio.
Problem je npr. polje deklarisano kao varchar2(4000), kada se upisuje string duzine 3768 slova u ISO8859-2 dug 3768 a u utf-8 4888 bajtova.
 
Odgovor na temu

Raspucin

Moderator
Član broj: 20699
Poruke: 216
212.200.97.*

ICQ: 244452581


+3 Profil

icon Re: Konverzija 8859-1 baze u utf819.05.2005. u 08:55 - pre 229 meseci
Razumem te sta hoces da kazes, ali za to nema leka.

Jedan od nacina da se izbegnu ovakvi problemi je da se varchar2 polja u bazi kreiraju na sledeci nacin:

varchar2( X char )

gde se umesto X upisuje broj karaktera, tako da se u bazi alociraju karakteri a ne bajtovi.

Drugo resenje koje vidim je (mada to sigurno nece da odgovara) konvertovanje varchar2(4000) polja u tabeli u CLOB.

Evo ti procedura koja ti stampa sve karaktere u tekucem character setu koji baza koristi, mozes, da je prepravis i da u bazi koju si kreirao sa UTF8 character setom proveris kako se vide i koliko mesta zauzimaju:

declare
i number;
j number;
k number;
begin
for i in 2..15 loop
for j in 1..16 loop
k:=i*16+j;
dbms_output.put((to_char(k,'000'))||':'||chr(k)||' ');
if k mod 8 = 0 then
dbms_output.put_line('');
end if;
end loop;
end loop;
end;

Znam sigurno da US7ASCII-ju odgovaraju 1 bajtu u UTF8, a za WE8ISO8859P1 moras da proveris, posto verovatno ima nekih karaktera koji u UTF8 zauzimaju dva bajta.

Ono sto mozes da uradis je da probas sa naredbom:

ALTER DATABASE CHARACTER SET AL32UTF8;

ali na kopiji baze koju imas NIKAKO na bazi koja radi, jer za ovo nema ROLLBACK. Kreiraj novu bazu, identicnu kao stara koju pokusavas da migriras. Importuj podatke i uradi sledece:

1. "Spusti" bazu (novu koju si kreirao):
SHUTDOWN NORMAL;
2. Pokreni sledece naredbe:
STARTUP MOUNT;
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
ALTER SYSTEM SET AQ_TM_PROCESSES=0;
ALTER DATABASE OPEN;
ALTER DATABASE CHARACTER SET AL32UTF8;
SHUTDOWN NORMAL;
STARTUP;

Ovo je najbrzi nacin da uradis promenu chararacter set-a, ali moze da se uradi ako su ispunjena dva uslova:

1. Svaki karater iz charakter set-a iz kog konvertujes mora da postoji u charater
set-u u koji konvertujes
2. Kodne vrednosti karatera u character set-ovima treba da odgovaraju jedna drugoj
(za ovo pogledaj dokumentaciju, ne secam se).

Na kraju krajeva, kada radis sa novom bazom probaj pa ces da vidis, kako ce da se ponasa izmena charakter set-a.

I na kraju upotrebi Character Set Scanner pa vidi kako ce da se ponasaju podaci pri konverziji.

Pozdrav

 
Odgovor na temu

[es] :: Oracle :: Konverzija 8859-1 baze u utf8

[ Pregleda: 3890 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.