sql >> Database >  >> RDS >> Oracle

Tekensetcoderingen en factoren voor opslaggrootte

Tenzij je alleen geïnteresseerd bent in de maximale verandering, is je voorbeeld niet correct.

AL32UTF8 is een tekenset met variabele lengte. In algemene termen gesproken, elk teken in de US7ASCII-tekenset duurt 1 byte, Europese tekens vereisen over het algemeen 2 bytes, verschillende Aziatische taaltekens vereisen 3 bytes en een handvol zeer zeldzame tekens vereist 4 bytes. Realistisch gezien, als je het hebt over het converteren van werkelijke WE8ISO8859P1-gegevens naar AL32UTF8, zie je in de praktijk over het algemeen een conversiefactor tussen 1 en 2 die veel dichter bij 1 ligt dan bij 2. Zonder de Unicode-toewijzing op te zoeken voor elk geldig WE8ISO8859P1-teken , het zou me verbazen als er 3 of 4 bytes aan opslagruimte nodig zijn in de AL32UTF8-tekenset.

In de Globalization Support Guide is er een sectie over tekensets die u vertelt welke tekensets single-byte zijn, welke multi-byte zijn en welke van de multi-byte tekensets een vaste breedte hebben. Bijna alle multi-byte-tekensets hebben een variabele breedte, dus de factor die u zoekt, hangt af van uw gegevens.

In de meeste gevallen is het beter om uw kolommen te declareren om semantiek van tekenlengte te gebruiken in plaats van semantiek van bytelengte, zodat de database achter de schermen kan uitzoeken hoeveel gegevens moeten worden toegewezen. Als u bijvoorbeeld een kolom

. declareert
CREATE TABLE foo (
  col1 VARCHAR2(10 CHAR)
)

Oracle zal ruimte toewijzen voor 10 tekens aan opslag, ongeacht de karakterset van de database en ongeacht het werkelijke aantal bytes dat nodig is om die gegevens op te slaan (met inachtneming van de limiet van 4000 bytes per VARCHAR2 kolom). Dat maakt het definiëren van kolomgroottes over het algemeen veel gemakkelijker omdat u de kolommen niet te groot hoeft te maken voor het geval iemand besluit 10 4-byte UTF-8-tekens in één rij te gooien en u gebruikers niet hoeft uit te leggen dat de kolom zal accepteren reeksen van verschillende aantallen karakters, afhankelijk van de taal en/of de specifieke karakters die gekozen zijn.

Hoewel de Oracle-mensen die regelmatig met globalisering te maken hebben, het afraden , geeft u er de voorkeur aan dat u de semantiek van de tekenlengte expliciet specificeert wanneer u uw kolommen declareert of in ieder geval alleen op sessieniveau instelt, kunt u de NLS_LENGTH_SEMANTICS initialisatieparameter om VARCHAR2(10) . te veroorzaken om standaard semantiek van tekenlengte te gebruiken in plaats van semantiek van bytelengte (u kunt nog steeds VARCHAR2(10 BYTE) opgeven als je semantiek van byte-lengte wilt).




  1. MySQLi-klassenpatroon voor verbinding, sluiten, open laten?

  2. Omgaan met zeer ernstige fouten in SQL Server

  3. Hoe vindt u de uitvoeringstijd van query's in Oracle SQL Developer?

  4. UTF-8 helemaal door