Oracle DBA Forum - 16 Використання підтримки глобалізації

Що таке кодування?

При обробці символів у комп'ютерній системі використовуються числові коди символів, а чи не їх графічне представлення. Схема кодування символів (encoded character set) визначає відповідність між символами, які можуть прийматися і виводитися комп'ютером або терміналом, і їх кодовим поданням. База даних Oracle зараз підтримує близько 30 схем кодування символів і при цьому значно більша кількість мов і територій (близько 100). Це можливо, тому що Unicode - універсальне кодування, що містить більшість основних символів, що використовуються під час листа (scripts) у світі.

Різні кодування підтримують різні набори символів (наприклад, кирилиця, латиниця). Оскільки кодування зазвичай ґрунтуються на певній письмовій системі (script), вони можуть підтримувати кілька мов. Проте такі кодування обмежені тому, що вони відповідають групам мов, заснованим на подібних наборах символів. Універсальні кодування використовують більшість письмових систем, що застосовуються в сучасних мовах і дають рішення для одночасної підтримки кількох мов. Для отримання додаткових відомостей про стандарти Unicode див. веб-сайт http://www.unicode.org.

База даних Oracle підтримує різні схеми кодування символів:

однобайтову; багабайтну змінної ширини; всесвітню.

В однобайтових кодування кожен символ займає один байт. Однобайтові 7-бітові кодування можуть визначати до 128 (2 ^ 7) символів; однобайтові 8-бітові кодування можуть визначати до 256 (2^8) символів.

Приклади однобайтових кодувань

American Standard Code for Information Interchange (Американський стандартний код обміну інформацією - ASCII) 7-bit American(US7ASCII) ASCII 7-bit Yugoslavian (YUG7ASCII) DEC VTTOO 7-bit French (F7DEC)

ISO (International Organization for Standards - Міжнародна організація зі стандартизації) 8859-1 West European (WE8IS08859P1) DEC 8-bit West European (WE 8 DE C) Extended Binary Coded Decimal Interchange Code (розширений двійково-десятковий код) обміну інформацією - EBCDIC) Code Page 1144 8-bit Italian (I8EBCDIC1144)

Примітка:ASCII-кодування підтримуються лише на платформах, що базуються на використанні ASCII. Кодування EBCDIC використовуються лише на платформах, що базуються на використанні EBCDIC.

У багатобайтових кодування на один символ відводиться один або кілька байтів. Зазвичай, багатобайтові кодування використовуються для підтримки азіатських мов. У деяких багатобайтових кодуваннях значення старшого біта використовується для вказівки, чи є байт поодиноким або входить до набору байтів, що представляють символ. Інші кодування розділяють однобайтові і багатобайтові символи. Пристрій посилає код керування, що показує, що наступні пари байтів будуть інтерпретуватися як подання одного символу до тих пір, поки не надійде керуючий код повернення до стандартного кодування. Кодування, що використовують код керування, в основному застосовуються на платформах IBM.

Приклади багатобайтових кодувань змінної ширини

Shift-JIS 16-bit Japanese (JA16S L S) MS Windows Code Page 950 з Hong Kong Додатковий Character Set HKSCS-2001 (ZHT16HKSCS) Unicode 4.0 UTF-8 Universal character set (AL32UTF8)

AL32UTF8 - кодування Unicode, що використовує 8-бітові кодові послідовності. Вона відноситься до типу кодувань змінної довжини і являє собою строгу надмножину над ASCII. Це означає, що кожномусимволу в 7-bit 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 ХР.

У початковій версії Unicode використовувався 2-байтовий формат кодування. Таке використання 16 біт для кожного елемента, що кодується дозволяє представити до 65536 символів. Однак потрібно підтримувати значну кількість символів. Наприклад, тільки спільнота розмовляючих китайською використовує понад 55000 символів. У таких мовах, як китайська, японська та корейська ще не закодовані десятки тисяч ідеограм. І незважаючи на те, що багато цих символів використовуються рідко, вони все ще представлені в документах, які повинні зберігатися в електронному вигляді.

Для виконання цієї вимоги в стандарті Unicode визначаються додаткові символи (supplementary characters). Застосовуючи два 16-бітових кодових покажчика (їх називають також замінними парами (surrogate pairs)) для представлення одного символу, можна додатково визначити до 1048576 символів.

Примітка:кодування UTF-16 та UTF-8 (з дефісом) відносяться до кодувань стандарту Unicode; UTF8, AL32UTF8 та AL16UTF16(без дефісу) відносяться до кодувань Oracle, що базуються на стандарті Unicode.

Примітка:Щоб отримати додаткові відомості про підтримку Oracle Unicode, див. Oracle Database Globalization Support Guide lOg Release 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 і терміналі клієнта використовується Simplified Chinese Windows, тобто. значення параметра NLS_LANG в оточенні клієнта SIMPLIFIED CHINESE_HONGKONG.US7ASCII. В цьому випадку можливі ситуації, коли користувач збереже багатобайтні символи Simplified Chinese в одному байті бази даних. Oracle оброблятиме символи як однобайтні символи кодування US7ASCII, тому всі SQL-функції маніпулювання рядками (наприклад, SUBSTR, LENGTH) виконуватимуть обробку на основі байта, а не символу. Всі ASCII символи можуть бути втрачені після експорту та імпорту в іншу базу даних.

Для досягнення найкращої продуктивності вибирайте кодування, яке усуває перетворення символів різних кодувань та використовує найбільш ефективну схему кодування для потрібної мови. Однобайтові кодування найбільш оптимальні з точки зору продуктивності та необхідного простору порівняно з багатобайтовими. Однак однобайтові кодування охоплюють обмежений набір мов, що використовуються.

Для правильного вибору кодування бази даних оцініть ваші поточні та майбутні бізнес-вимоги, а також технічні вимоги (наприклад, увідповідність зі стандартами XML та Java потрібно використовувати Unicode). У загальному випадку Oracle рекомендує використовувати Unicode для всіх нових баз даних, оскільки це найбільш гнучке кодування, яке також дозволить уникнути перетворень у майбутньому.

Для вказівки кодування використовується команда CREATE DATABASE. У ній у пропозиції CHARACTER SET оголошується кодування бази даних та у пропозиції NATIONAL CHARACTER SET - національне кодування. Якщо NATIONAL CHARACTER SET не вказується, тоді за промовчанням задається національне кодування AL16UTF16.

Після створення бази даних може знадобитися змінити кодування БД. Це може бути викликано появою непередбачених заздалегідь вимог, наприклад, необхідністю підтримки нових джерел даних (ХА, сховище даних тощо). Часто така зміна може призвести до значних витрат часу і виявитися дорогим процесом. У більшості випадків потрібно буде виконати повний експорт/імпорт, щоб відповідним чином перетворити дані зі старого кодування на нове.

Кодування бази даних та національні кодування

Оскільки кодування бази даних використовується для ідентифікації та зберігання вихідного коду SQL і PL/SQL, вона повинна в залежності від платформи включати 7-бітове кодування ASCII або EBCDIC. Тому багатобайтне кодування фіксованої ширини не може використовуватися як кодування бази даних, а може використовуватися тільки як національне кодування.

Національне кодування - це альтернативне кодування, яке дозволяє зберігати символьні дані в кодуванні Unicode, якщо кодування бази даних не визначено Unicode. Для зберігання типів даних SQL NCHAR, NVARCHAR2 та NCLOB використовується лише кодування Unicode. Можна вибрати одну з двохтаких кодувань: UTF8 або AL16UTF16.

Cьогодні: 18:58 . Часовий пояс GMT +3.

Сторінка 1 з 3123>