Oracle
 sql >> Database >  >> RDS >> Oracle

Codifiche dei set di caratteri e fattori di dimensione della memoria

A meno che tu non sia interessato solo al massimo cambiamento, il tuo esempio non è corretto.

AL32UTF8 è un set di caratteri a lunghezza variabile. Parlando in termini generali, qualsiasi carattere che si trova nel set di caratteri US7ASCII occuperà 1 byte, i caratteri europei generalmente richiedono 2 byte, i vari caratteri delle lingue asiatiche richiedono 3 byte e una manciata di caratteri molto rari richiederà 4 byte. Realisticamente, se stai parlando di convertire i dati WE8ISO8859P1 effettivi in ​​AL32UTF8, generalmente vedrai in pratica un fattore di conversione tra 1 e 2 che è molto più vicino a 1 che a 2. Senza cercare la mappatura Unicode per ogni carattere WE8ISO8859P1 valido , sarei sorpreso se fossero necessari 3 o 4 byte di spazio di archiviazione nel set di caratteri AL32UTF8.

Nella Globalization Support Guide, c'è una sezione su set di caratteri che indica quali set di caratteri sono a byte singolo, quali sono multibyte e quali set di caratteri multibyte sono a larghezza fissa. Quasi tutti i set di caratteri multibyte sono a larghezza variabile, quindi il fattore che stai cercando dipenderà dai tuoi dati.

Nella maggior parte dei casi, è meglio dichiarare che le colonne utilizzano la semantica della lunghezza dei caratteri piuttosto che la semantica della lunghezza dei byte, lasciando che il database capisca dietro le quinte quanti dati allocare. Ad esempio, se dichiari una colonna

CREATE TABLE foo (
  col1 VARCHAR2(10 CHAR)
)

Oracle allocherà spazio per 10 caratteri di archiviazione indipendentemente dal set di caratteri del database e dal numero effettivo di byte necessari per archiviare tali dati (soggetto al limite di 4000 byte per VARCHAR2 colonna). Ciò generalmente rende molto più semplice la definizione delle dimensioni delle colonne perché non è necessario sovradimensionare le colonne nel caso in cui qualcuno decida di inserire 10 caratteri UTF-8 a 4 byte in una riga e non è necessario spiegare agli utenti che la colonna accetterà stringhe di diverso numero di caratteri a seconda della lingua e/o dei caratteri specifici scelti.

Sebbene le persone di Oracle che si occupano regolarmente di globalizzazione lo scoraggino , preferendo specificare esplicitamente la semantica della lunghezza dei caratteri quando dichiari le colonne o almeno impostarla solo a livello di sessione, puoi impostare NLS_LENGTH_SEMANTICS parametro di inizializzazione per causare VARCHAR2(10) per utilizzare la semantica della lunghezza dei caratteri anziché la semantica della lunghezza dei byte per impostazione predefinita (puoi comunque specificare VARCHAR2(10 BYTE) se vuoi una semantica di lunghezza in byte).