Ékezetes betűk -- voltam már boldogabb


YaSql> select 'árvíztűrő tüköfúrógép' from duale;

select 'árvíztűrő tüköfúrógép' from duale
ORA-00942: table or view does not exist (DBD ERROR: error possibly near <*> indicator at char 36 in
'select 'árvíztűrÅ� tüköfúrógÃ<*>©p' from duale')

Pedig azt hallottam, hogy az UTF8 bevezetése mindent megold.

Hozzászólások

Hányas Orákulum?

Az UTF8 önmagában semmit nem old meg. Azt végig is kell vezetni a rendszeren.

https://lzsiga.users.sourceforge.net/ekezet.html

Azt még nem mondtam, hogy ezt én írtam, szóval a triviális gondokat már kezeltem volna.

Most azt kellene megnézni, hogy a DB-től jövő hibaüzeneten rajta van-e az 'is_utf8' jelző, meg az eredeti SQL-utasításon ugyanez. (Mindkettőre 'igen' válasz kellene.)

Szerkesztve: 2024. 12. 23., h – 12:47

Első ránézésre azt mondanám, hogy van egy DBI::errstr nevű változó, ami szerintem jobb lenne, ha UTF8-ban lenne. [Szerk: mármint abban van, csak nincs beállítva az 'is_utf8' jelzőbit rajta]
Lásd még ezt: https://metacpan.org/pod/DBI#set_err

Ahogy most érteni vélem, hogy a Perl source kétféle kódolásban lehet (mármint az interpreter szerint), az egyik az UTF-8 ('use utf8'), a másik a 'mitbánomén' ('no utf8').

Ha az utóbbit konvertálni akarjuk utf8-ra/-ról, azt csinálhatjuk úgy, hogy explicit megadjuk a használt kódolást (Encode modul), vagy a default-ra hagyatkozunk (utf8 modul), ami az ISO-8859-1.

Szerkesztve: 2024. 12. 22., v – 22:19

Ez valamit segített, de nem 100%


       my $err = $DBI::errstr;
+      _utf8_on($err);
       debugmsg(3, sprintf("line %d DBI::errstr='%s' is_utf8=%d", __LINE__, $err, is_utf8($err)));

Ezt sikerült vele:

ORA-00942: table or view does not exist (DBD ERROR: error possibly near <*> indicator at char 36 in 'select 'árvíztűrő tüköfúróg\xFFFD<*>\xFFFDp' from duale')

Vagyis bele akarta illeszteni a stringbe a <*> részt, és ügyesen kettévágott egy utf8 szekvenciát. (Ezt a DBD-Oracle csinálja, azon belül az oci8.c)