sql >> Databáze >  >> RDS >> Oracle

Kódování znakové sady a faktory velikosti úložiště

Pokud vás nezajímá pouze maximální změna, váš příklad není správný.

AL32UTF8 je znaková sada s proměnnou délkou. Obecně řečeno, jakýkoli znak, který je ve znakové sadě US7ASCII, zabere 1 bajt, evropské znaky obecně vyžadují 2 bajty, různé znaky asijských jazyků vyžadují 3 bajty a hrstka velmi vzácných znaků bude vyžadovat 4 bajty. Realisticky, pokud mluvíte o převodu skutečných dat WE8ISO8859P1 na AL32UTF8, v praxi obecně uvidíte převodní faktor mezi 1 a 2, který je mnohem bližší 1 než 2. Aniž byste museli hledat mapování Unicode pro každý platný znak WE8ISO8859P1 Překvapilo by mě, kdyby některý vyžadoval 3 nebo 4 bajty úložiště ve znakové sadě AL32UTF8.

V příručce Globalization Support Guide je sekce znakové sady to vám řekne, které znakové sady jsou jednobajtové, které vícebajtové a které z vícebajtových znakových sad mají pevnou šířku. Téměř všechny vícebajtové znakové sady mají proměnnou šířku, takže faktor, který hledáte, bude záviset na vašich datech.

Ve většině případů je lepší deklarovat své sloupce tak, aby používaly sémantiku délky znaků spíše než sémantiku délky bajtů, a nechat databázi, aby v zákulisí zjistila, kolik dat má alokovat. Pokud například deklarujete sloupec

CREATE TABLE foo (
  col1 VARCHAR2(10 CHAR)
)

Oracle přidělí prostor pro 10 znaků úložiště bez ohledu na znakovou sadu databáze a bez ohledu na skutečný počet bajtů potřebných k uložení těchto dat (s výhradou limitu 4 000 bajtů na VARCHAR2 sloupec). To obecně usnadňuje definování velikostí sloupců, protože nemusíte sloupce předimenzovat v případě, že se někdo rozhodne hodit 10 4bajtových znaků UTF-8 do jednoho řádku a vy nemusíte uživatelům vysvětlovat, že sloupec bude akceptovat řetězce různého počtu znaků v závislosti na jazyku a/nebo konkrétních zvolených znacích.

Ačkoli lidé z Oracle, kteří se globalizací zabývají pravidelně od ní odrazují , chcete-li sémantiku délky znaků při deklarování sloupců výslovně specifikovat nebo ji alespoň nastavit pouze na úrovni relace, můžete nastavit NLS_LENGTH_SEMANTICS inicializační parametr způsobí VARCHAR2(10) ve výchozím nastavení používat sémantiku délky znaků namísto sémantiky délky bajtů (stále můžete zadat VARCHAR2(10 BYTE) pokud chcete sémantiku délky bajtů).




  1. Instalace PostGresQL &MySQL v Mac OS X s MAMP?

  2. Tabulky MySql, chyba #1064 &chyba #1068 Definováno více primárních klíčů

  3. odeslání zprávy uživateli předáním jeho ID do modální schránky

  4. Výmaz CTE není potvrzen, dokud nebudou dokončeny následující příkazy