Форум на Oracle DBA - 16 Използване на поддръжка за глобализация
Какво е кодиране?
При обработката на знаци в компютърна система се използват цифрови кодове на знаци, а не тяхното графично представяне. Схемата за кодиране на знаци (кодиран набор от знаци) определя съответствието между знаците, които могат да бъдат получени и показани от компютър или терминал, и тяхното кодиране. В момента базата данни на Oracle поддържа около 30 схеми за кодиране на знаци и много по-голям брой езици и територии (около 100). Това е възможно, защото Unicode е универсално кодиране, съдържащо повечето от основните знаци, използвани при писане (скриптове) в съвременния свят.
Различните кодировки поддържат различни набори от символи (например кирилица, латиница). Тъй като кодировките обикновено се основават на определен скрипт, те могат да поддържат множество езици. Такива кодировки обаче са ограничени в смисъл, че съответстват на групи от езици, базирани на подобни набори от знаци. Универсалните кодировки, от друга страна, използват повечето от системите за писане, използвани в съвременните езици, и предоставят решение за поддръжка на множество езици едновременно. За повече информация относно стандартите Unicode вижте http:www.unicode.org.
Oracle Database поддържа различни схеми за кодиране на знаци:
еднобайтов; многобайтова променлива ширина; в световен мащаб.
При еднобайтови кодировки всеки знак заема един байт. Еднобайтовите 7-битови кодировки могат да дефинират до 128 (2^7) знака; еднобайтовите 8-битови кодировки могат да дефинират до 256 (2^8) знака.
Примери за еднобайтово кодиране
Американски стандартен код за обмен на информация (ASCII) 7-битов американски(US7ASCII) ASCII 7-битов югославски (YUG7ASCII) DEC VTTOO 7-битов френски (F7DEC)
ISO (Международна организация за стандарти) 8859-1 Западноевропейски (WE8IS08859P1) DEC 8-битов западноевропейски (WE 8 DE C) Разширен двоично кодиран десетичен код за обмен (EBCDIC) Код Страница 1144 8-битов италиански (I8EBCDIC1144)
Забележка:ASCII кодировките се поддържат само на базирани на ASCII платформи. EBCDIC кодировките се използват само на платформи, базирани на EBCDIC.
При многобайтови кодировки един или повече байта се разпределят на знак. Обикновено многобайтовите кодировки се използват за поддръжка на азиатски езици. В някои многобайтови кодирания стойността на най-значимия бит се използва, за да посочи дали байтът е един байт или е част от набор от байтове, представляващи знак. Други кодировки разделят еднобайтови и многобайтови знаци. Устройството изпраща контролен код, показващ, че следващите двойки байтове ще бъдат интерпретирани като представляващи един знак, докато не бъде получен контролен код за връщане към стандартно кодиране. Кодирането на контролния код се използва предимно на IBM платформи.
Примери за многобайтово кодиране с променлива ширина
Shift-JIS 16-битов японски (JA16S L S) MS Windows кодова страница 950 с хонконгски допълнителен набор от знаци HKSCS-2001 (ZHT16HKSCS) Unicode 4.0 UTF-8 Универсален набор от знаци (AL32UTF8)
AL32UTF8 е Unicode кодиране, използващо 8-битови кодови последователности. Принадлежи към типа кодировки с променлива дължина и е строг набор от ASCII. Това означава, че всекисимвол в 7-битов ASCII съответства на същата кодова стойност в AL32UTF8.
Един знак в това Unicode кодиране може да бъде предоставен с 1, 2, 3 или 4 байта. Знаците от европейските национални азбуки се поддържат с помощта на 1 или 2 байта; Знаци от азиатските национални азбуки - 3 байта и допълнителни знаци - 4 байта.
AL16UTF16 е Unicode кодиране, използващо 16-битови кодови последователности.
В тази система за кодиране един знак може да бъде представен с 2 или 4 байта. Символите на европейските азбуки (както и ASCII) и повечето азиатски азбуки са представени с 2 байта. Допълнителните знаци се показват в 4 байта. AL16UTF16 е основното Unicode кодиране за Microsoft Windows 2000 и Windows XP.
Оригиналната версия на Unicode използва 2-байтов кодиращ формат. Това използване на 16 бита за всеки кодиран елемент позволява да бъдат представени до 65536 знака. Трябва обаче да се поддържа много по-голям брой знаци. Например само китайскоговорящата общност използва над 55 000 знака. В езици като китайски, японски и корейски десетки хиляди идеограми все още не са кодирани. И докато много от тези знаци се използват рядко, те все още присъстват в документи, които трябва да се съхраняват електронно.
За да изпълни това изискване, стандартът Unicode дефинира допълнителни знаци. Чрез използване на два 16-битови кодови указателя (наричани също сурогатни двойки) за представяне на един знак могат да бъдат дефинирани до 1 048 576 допълнителни знака.
Забележка:UTF-16 и UTF-8 (с тире) са Unicode кодировки; UTF8, AL32UTF8 и AL16UTF16(без тире) се отнасят за кодировки на Oracle, базирани на стандарта Unicode.
Забележка:За повече информация относно поддръжката на Oracle Unicode вижте Ръководството за поддръжка на глобализация на базата данни на Oracle lOg издание 2 (10.2).
Как се използват кодировките?
NLS_LANG указва схемата за кодиране на знаци за клиентския терминал. Различните клиенти могат да използват различни кодировки. Ако кодировките на клиента и сървъра са различни, тогава при прехвърляне на данни между тях се извършва автоматично преобразуване.
Кодирането на базата данни трябва да бъде надмножество или еквивалент на всички клиентски кодировки. Прекодирането се извършва в прозрачен за клиентското приложение режим.
Когато кодирането на базата данни и клиента съвпадат, Oracle приема, че информацията се получава и предава в една и съща схема на кодиране и не извършва никакви проверки или преобразувания.
Преобразуването от едно кодиране в друго може да се наложи в среда клиент/сървър, когато клиентското приложение се хоства на платформа, различна от сървърната, и не използва същата схема за кодиране. Данните за знаци, предавани между клиент и сървър, трябва да бъдат преобразувани от една схема на кодиране в друга. Преобразуването на знаци става автоматично и прозрачно с помощта на Oracle Net.
Такива проблеми трябва да се избягват
В базата данни се въвеждат невалидни данни, когато променливата на средата NLS_LANG е зададена неправилно на клиента. Стойността на NLS_LANG трябва да отразява схемата за кодиране на данните, пристигащи на сървъра.
Ако променливата на средата NLS_LANG е зададена правилно, тогава базата данни може автоматично да превежда данни, идващи от клиентската операционна система. Ако променливата на средата NLS LANG е зададена неправилно,тогава базата данни не трансформира правилно входящите данни.
Да предположим например, че кодирането на базата данни е AL32UTF8, клиентът работи с българската версия на операционната система Windows (кодова страница: CL8MSWIN1251) и клиентът има променливата на средата NLS_LANG, зададена на AL32UTF8. Данните влизат в базата данни в кодиране CLE8MSWIN1251 и не се преобразуват в AL32UTF8, тъй като настройката в NLS_LANG съответства на кодирането на базата данни. Следователно базата данни на Oracle приема, че не са необходими преобразувания и в базата данни се въвеждат неправилни данни.
Пример за друг проблем
Нека кодирането на базата данни е US7ASCII и клиентският терминал използва опростен китайски Windows, т.е. стойността на параметъра NLS_LANG в клиентската среда SIMPLIFIED CHINESE_HONGKONG.US7ASCII. В този случай е възможно потребителят да съхранява многобайтови опростен китайски символи в един байт на базата данни. Oracle ще третира символите като еднобайтови символи US7ASCII, така че всички функции за манипулиране на SQL низове (напр. SUBSTR, LENGTH) ще обработват на байтова база, а не на символна основа. Всички не-ASCII символи може да бъдат загубени след експортиране и импортиране в друга база данни.
За най-добра производителност изберете кодиране, което елиминира преобразуването на знаци от различни кодировки и използва най-ефективната схема за кодиране за желания език. Еднобайтовите кодировки са най-оптималните по отношение на производителността и необходимото пространство в сравнение с многобайтовите кодировки. Въпреки това, еднобайтовите кодировки покриват ограничен набор от използвани езици.
За да изберете правилното кодиране на базата данни, оценете своите настоящи и бъдещи бизнес и технически изисквания (например всъответствието със стандартите XML и Java изисква да се използва Unicode). Като цяло Oracle препоръчва използването на Unicode за всички нови бази данни, тъй като това е най-гъвкавото кодиране и също така ще избегне бъдещи преобразувания.
Командата CREATE DATABASE се използва за указване на кодирането. Той декларира набора от знаци на базата данни в клаузата CHARACTER SET и националния набор от знаци в клаузата NATIONAL HARACTER SET. Ако NATIONAL CHARACTER SET не е указан, тогава националният набор от знаци е AL16UTF16 по подразбиране.
След като създадете базата данни, може да се наложи да промените кодирането на базата данни. Това може да се дължи на непредвидени изисквания, например необходимостта от поддръжка на нови източници на данни (XA, хранилище на данни и др.). Често такава промяна може да доведе до значителни времеви разходи и може да бъде скъп процес. В повечето случаи ще трябва да направите пълно експортиране/импортиране, за да конвертирате данните от старото кодиране в новото по подходящ начин.
Кодиране на бази данни и национално кодиране
Тъй като кодирането на базата данни се използва за идентифициране и съхраняване на изходния код на SQL и PL/SQL, то трябва да включва 7-битово ASCII или EBCDIC кодиране, в зависимост от платформата. Следователно многобайтовото кодиране с фиксирана ширина не може да се използва като кодиране на база данни, а може да се използва само като национално кодиране.
Кодирането на локала е алтернативно кодиране, което позволява данните за символи да се съхраняват в Unicode, когато Unicode не е дефиниран като кодиране на базата данни. SQL типовете данни NCHAR, NVARCHAR2 и NCLOB използват само Unicode кодиране, за да ги съхраняват. Можете да изберете едно от двететакива кодировки: UTF8 или AL16UTF16.
Текущ час: 18:58 . Часовата зона е GMT +3. |
Страница 1 от 3 | 1 | 2 | 3 | > |