Oracle
 sql >> база данни >  >> RDS >> Oracle

Кодиране на набор от символи и фактори за размер на паметта

Освен ако не се интересувате само от максималната промяна, вашият пример не е правилен.

AL32UTF8 е набор от символи с променлива дължина. Говорейки в общи линии, всеки символ, който е в набора от символи US7ASCII, ще заема 1 байт, европейските знаци обикновено изискват 2 байта, символите на различни азиатски езици изискват 3 байта, а няколко много редки знаци ще изискват 4 байта. Реално погледнато, ако говорите за преобразуване на действителни WE8ISO8859P1 данни в AL32UTF8, обикновено ще видите на практика коефициент на преобразуване между 1 и 2, който е много по-близък до 1, отколкото до 2. Без да търсите съпоставянето на Unicode за всеки валиден знак WE8ISO8859P1 , ще се изненадам, ако някой изисква 3 или 4 байта място за съхранение в набора от символи AL32UTF8.

В Ръководството за поддръжка на глобализацията има раздел за набори от знаци който ви казва кои набори от символи са еднобайтови, кои са многобайтови и кои от многобайтовите набори от символи са с фиксирана ширина. Почти всички многобайтови набори от знаци са с променлива ширина, така че факторът, който търсите, ще зависи от вашите данни.

В повечето случаи е по-добре да декларирате колоните си да използват семантика за дължина на символа, а не семантика за дължина на байта така или иначе, оставяйки базата данни да разбере зад кулисите колко данни да разпредели. Например, ако декларирате колона

CREATE TABLE foo (
  col1 VARCHAR2(10 CHAR)
)

Oracle ще отдели място за 10 знака за съхранение, независимо от набора от символи на базата данни и независимо от действителния брой байтове, необходими за съхраняване на тези данни (при спазване на ограничението от 4000 байта на VARCHAR2 колона). Това обикновено прави определянето на размерите на колоните много по-лесно, защото не е нужно да увеличавате размера на колоните, в случай че някой реши да хвърли 10 4-байтови UTF-8 знака в един ред и не е нужно да обяснявате на потребителите, че колоната ще приеме низове от различен брой знаци в зависимост от езика и/или избраните конкретни знаци.

Въпреки че хората от Oracle, които се занимават редовно с глобализацията, обезсърчават това , като предпочитате изрично да посочите семантиката на дължината на знаците, когато декларирате вашите колони или поне да я зададете само на ниво сесия, можете да зададете NLS_LENGTH_SEMANTICS параметър за инициализация да предизвика VARCHAR2(10) за да използвате по подразбиране семантика за дължина на символа, а не семантика за дължина на байта (все пак можете да посочите VARCHAR2(10 BYTE) ако искате семантика с дължина на байта).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ODP.NET / EF6 - тип данни CHAR в клаузата WHERE

  2. Създаване на CSV файл на Loop | PLSQL Oracle SQL разработчик

  3. Как да проектираме модел на данни, който се занимава с настоящите служители и прогнозираните служители?

  4. Процент SQL Oracle

  5. Приложете функцията COUNT върху подгрупа от групи