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

La lunghezza massima di VARCHAR è 4000 ma è possibile memorizzare solo testo tailandese lungo 2666 byte

Il problema

Quando si descrive un VARCHAR, è necessario fornire un'unità, ad es. VARCHAR2(200 BYTE) o VARCHAR2(200 CHAR) . Se ometti l'unità, l'impostazione predefinita è BYTE (vedi Oracle Database Concepts, capitolo Tipi di dati Oracle ). Questo sembra essere un dettaglio minore, ma diventa piuttosto severo, quando hai set di caratteri multi byte.

Situazione fino a 11 g

Sfortunatamente esiste un limite rigido alla dimensione massima di una colonna VARCHAR2. Sono 4000 BYTE (!) (vedi Riferimento al database Oracle, capitolo Tipi di dati Oracle ) fino a Oracle 11g e . Questo è un limite difficile e non c'è modo di aggirarlo. L'unico modo per aggirare questo problema è una colonna CLOB.

Soluzione per 12c

La situazione è diversa su Oracle 12c. Lì puoi usare il parametro MAX_STRING_SIZE = EXTENDED per aumentare il limite fino a 32767 BYTE (consultare Oracle Database Language Reference, capitolo Tipi di dati e Oracle Database Reference, capitolo Parametri di inizializzazione ). Quindi la soluzione ovvia è:eseguire l'aggiornamento a Oracle 12c, impostare MAX_STRING_SIZE = EXTENDED secondo la documentazione e modificare la definizione della tabella. Potresti perdere alcuni indici quando modifichi la tua tabella, perché in precedenza a 12c non gli indici non potevano contenere valori VARCHAR2 con più di 4000 BYTE e potrebbero esserci ancora alcune limitazioni. (Devo verificare il problema con gli indici e se può essere risolto ricostruendo gli indici).

Soluzione:modifica la codifica del database

Potresti provare a cambiare la codifica del tuo database nativo (il modo in cui il tuo database mappa i CHAR in BYTE). Per questo di solito devi creare un nuovo database e fornire un parametro appropriato per NLS_CHARACTERSET. Questo è un cambiamento molto grande nel modo in cui funziona il tuo database e potrebbe avere diversi effetti collaterali. Se provi ad aggiungere caratteri con una codifica diversa, potresti essere sfortunato (cioè non puoi memorizzarli nel tuo database). Quindi non suggerirei questa soluzione.

Soluzione:passa a CLOB

Di solito non è necessario fornire query arbitrarie su campi di testo così grandi. Potresti provare a identificare le query selezionando nella colonna di testo grande e migrarle in Oracle Text su una colonna CLOB. Ma questo è un cambiamento molto grande e potrebbe non essere possibile con il tuo schema esistente o la tua applicazione. Potresti ritrovarti con una serie di trigger "INVECE DI" e con alcuni controlli dei vincoli mancanti (che coinvolgono la colonna CLOB appena creata).

Soluzione:usa XML

Invece di un CLOB potresti provare a memorizzare la tua stringa come una colonna XML. La dimensione massima per questi è 4 GB. Danneggerà le tue prestazioni, dovrai fornire INVECE DI trigger e potresti perdere alcuni vincoli, ma potrebbe funzionare per te.