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

Tegnsætkodninger og lagerstørrelsesfaktorer

Medmindre du kun er interesseret i den maksimale ændring, er dit eksempel ikke korrekt.

AL32UTF8 er et tegnsæt med variabel længde. I almindelighed vil ethvert tegn, der er i US7ASCII-tegnsættet, tage 1 byte, europæiske tegn kræver generelt 2 bytes, forskellige asiatiske sprogtegn kræver 3 bytes, og en håndfuld meget sjældne tegn vil kræve 4 bytes. Realistisk set, hvis du taler om at konvertere faktiske WE8ISO8859P1-data til AL32UTF8, vil du generelt i praksis se en konverteringsfaktor mellem 1 og 2, der er meget tættere på 1 end på 2. Uden at slå Unicode-tilknytningen op for hvert gyldigt WE8ISO8859P1-tegn. , jeg ville blive overrasket, hvis nogen krævede 3 eller 4 bytes lagerplads i AL32UTF8 tegnsættet.

I Globalization Support Guide er der et afsnit om tegnsæt der fortæller dig, hvilke tegnsæt der er single-byte, hvilke er multi-byte, og hvilke af multi-byte tegnsættene har fast bredde. Næsten alle multi-byte tegnsæt har variabel bredde, så den faktor, du leder efter, afhænger af dine data.

I de fleste tilfælde er det bedre at erklære dine kolonner til at bruge karakterlængde-semantik i stedet for byte-længde-semantik alligevel, hvilket lader databasen finde ud af bag kulisserne, hvor meget data der skal tildeles. For eksempel, hvis du erklærer en kolonne

CREATE TABLE foo (
  col1 VARCHAR2(10 CHAR)
)

Oracle vil allokere plads til 10 tegn lagring uanset databasens tegnsæt og uanset det faktiske antal bytes, der kræves for at gemme disse data (med forbehold for grænsen på 4000 bytes pr. VARCHAR2 kolonne). Det gør det generelt meget nemmere at definere kolonnestørrelser, fordi du ikke behøver at overdimensionere kolonnerne, hvis nogen beslutter sig for at smide 10 4-byte UTF-8-tegn i én række, og du ikke behøver at forklare brugerne, at kolonnen vil acceptere strenge med forskelligt antal tegn afhængigt af sproget og/eller de specifikke valgte tegn.

Selvom de Oracle-folk, der beskæftiger sig med globalisering regelmæssigt fraråder det , og foretrækker, at du eksplicit angiver tegnlængde-semantikken, når du erklærer dine kolonner eller i det mindste kun indstiller den på et sessionsniveau, kan du indstille NLS_LENGTH_SEMANTICS initialiseringsparameter at forårsage VARCHAR2(10) at bruge tegnlængde semantik i stedet for byte længde semantik som standard (du kan stadig angive VARCHAR2(10 BYTE) hvis du ønsker byte-længde semantik).




  1. Hvorfor datasikkerhedskopier er vigtige for din organisation

  2. Sådan implementeres Oracle count (distinct) over partition i Postgres

  3. hvilken er den bedste måde at ændre tegnsættet for store datatabeller?

  4. Tæl hvor mange rækker der har samme værdi