SQL*Plus e larghezza delle colonne

giovedì 26 luglio 2007 alle 26:09 | Pubblicato su Diario | Lascia un commento

Tempo fa mi ricordo di aver visto qualche parte un problemino legato alla larghezza con cui sql*plus visualizza alcune collonne. Mi pareva di ricordare che la cosa dipendesse da un settaggio lato server (quindi non banale da capire) e perciò mi sono rimesso alla ricerca di questa informazione, ero abbastanza convinto di averla vista o su un sito di Tom Kyte o sul sito di Jonathan Lewis. Oggi ho trovato qualcosa su AskTom. Non sono sicuro sia quanto avevo visto a suo tempo ma sicuramente è interessante.

Mi sono messo a fare delle prove perchè mi è capitato di incontrare simili anomalie. Prima ancora di arrivare al settaggio del parametro  CURSOR_SHARING ho riscontrato il problema derivante dal settaggio del character set, non solo lato server ma anche lato client.

Ho fatto dei test usando come client sqlplus su windows fornito insieme all’instant client, versione 10.2.0.1.

a) server 10.2.0.2 NLS_LANG=ITALIAN_ITALY.WE8MSWIN1252, client NLS_LANG=ITALIAN_ITALY.WE8MSWIN1252 :

SQL> select substr(host_name,1,5) hoh from v$instance;

HOH
—–
jupit

2) server 10.2.0.2 NLS_LANG=ITALIAN_ITALY.WE8MSWIN1252, client NLS_LANG=ITALIAN_ITALY_AL32UTF8 :

SQL> select substr(host_name,1,5) hoh from v$instance;

HOH
—————
jupit

Qui troviamo la prima anomalia: perchè la colonna è larga 15 caratteri?

3) server 10.2.0.2 NLS_LANG=AMERICAN_AMERICA.AL32UTF8, client NLS_LANG=ITALIAN_ITALY_AL32UTF8 :

SQL> select substr(host_name,1,5) hoh from v$instance;

HOH
——————–
MARTE

Qui la larghezza della colonna è quattro volte la larghezza della stringa, 20 caratteri; questo è consistente con il fatto che UTF8 può usare fino a 4 byte per carattere.

4) server 10.2.0.2 NLS_LANG=AMERICAN_AMERICA.AL32UTF8, client NLS_LANG=ITALIAN_ITALY.WE8MSWIN1252

SQL> select substr(host_name,1,5) hoh from v$instance;

HOH
——————–
MARTE

Anche qui moltiplica per quattro, indipendentemente dal settaggio del client

Non ho capito bene perchè in alcuni casi viene usato il fattore tre e in altri il fattore quattro quando si passa da charset monobyte a charset utf8. Infatti ho già riscontrato il fatto con l’istruzione

“create table x as select * from y@remotedbmonobyte”

da un database con charset AL32UTF8 che copia dati da un database con charset WE8ISO8859P15 la largezza di tutte le colonne di tipo char e varchar2 vengono  moltiplicate per tre (fino al massimo di 4000 per i varchar2 e 2000 per i char).

Lascia un commento »

RSS feed for comments on this post. TrackBack URI

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

Crea un sito o un blog gratuitamente presso WordPress.com.
Entries e commenti feeds.

%d blogger cliccano Mi Piace per questo: