Освен ако не се интересувате само от максималната промяна, вашият пример не е правилен.
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)
ако искате семантика с дължина на байта).