Использование Юникода в программах PL/SQL на примерах
До разработки стандарта Юникод существовало множество схем кодировки, которые обладали ограниченными возможностями, а порой и конфликтовали друг с другом. Разработка глобальных приложений по единым правилам была практически невозможна, потому что ни одна кодировка не поддерживала все символы.
-
- Типы данных и национальные наборы символов
- Кодировка символов
- Параметры Globalization Support (NLS)
- Функции юникода
- Вас заинтересует / Intresting for you:
Стандарт Юникод решает все эти проблемы. Он разрабатывается и сопровождается Консорциумом Юникода. Содержимое каждой версии определяется Стандартом Юникода и Базой данных символов Юникода, или USD (Unicode Character Database).
Набор символов Юникода позволяет хранить и извлекать данные в более чем 200 различных отдельных наборах. Использование набора символов Юникода обеспечивает поддержку всех этих наборов без внесения архитектурных изменений в приложение.
- Oracle11g Release 2 поддерживает Юникод версии 5.0. Этот стандарт, впервые опубликованный в 2006 году, обеспечивает кодирование более одного миллиона символов. Этого достаточно для поддержки всех современных символов, а также многих древних или малораспространенных алфавитов. Oracle Database 12c включает поддержку Юникода 6.1 (стандарт опубликован в январе 2012 г.) и вводит несколько новых лингвистических порядков сопоставления, соответствующих правилам UCA (Unicode Conation Algorithm).
- Наборы символов Юникода в Oracle11g включают кодировки UTF-8 и UTF-16 . В UTF-8 для представления символа используется 1, 2 или 3 байта в зависимости от символа. В UTF-16 символ всегда представляется двумя байтами. В обеих схемах поддерживаются дополнительные символы, использующие 4-байтовое представление независимо от выбранного набора символов Юникода.
- Наборы символов Юникода в Oracle Database 11g и 12c включают кодировки UTF-8 и UTF-16 . В UTF-8 символы представляются 1, 2 или 3 байтами в зависимости от символа. В UTF-16 все символы представляются 2 байтами. Дополнительные символы поддерживаются обеими кодировками и представляются 4 байтами на символ независимо от выбранной кодировки.
Каждая база данных Oracle имеет два набора символов. Первичный набор символов используется для большинства функций приложений, а отдельный набор символов NLS — для типов данных и функций, специфических для NLS . Для определения используемых наборов символов используется следующий запрос:
SELECT parameter, VALUE FROM nls_database_parameters WHERE parameter IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET') В рабочей среде автора запрос возвращает следующий результат: PARAMETER VALUE ------------------------- ---------- NLS_CHARACTERSET AL32UTF8 NLS_NCHAR_CHARACTERSET AL16UTF16
В данном случае параметр NLS_CHARACTERSET (первичный набор символов базы данных) имеет значение AL32UTF8 . В этот 32-разрядный набор символов Юникода UTF-8 входит большинство самых распространенных символов в мире. Параметр NLS_NCHAR_ CHARACTERSET , используемый прежде всего для столбцов NCHAR и NVARCHAR2 , представляет собой 16-разрядный набор символов UTF-16 .
Структура имен, присваиваемых наборам символов в Oracle , содержит полезную информацию. Например, US7ASCII поддерживает символы английского языка для США. Набор символов AL32UTF8 поддерживает любые языки. Вторая часть строки определяет количество битов на символ. В US7ASCII символ представляется 7 битами, а AL32UTF8 использует до 32 бит на символ. Оставшаяся часть строки содержит «официальное» название набора символов. Структура имени представлена на рис. 1.
Рис. 1. Структура имени набора символов в Oracle
За дополнительной информацией о Юникоде обращайтесь на сайт Стандарта Юникод по адресу.
Типы данных и национальные наборы символов
Типы данных Globalization Support nclob , nchar и nvarchar2 используют набор символов, определяемый параметром nls_nchar_characterset , — вместо набора символов по умолчанию, устанавливаемого для базы данных в параметре nls_characterset . Эти типы данных поддерживают только многобайтовые символы Юникода, поэтому даже при работе с базой данных, в которой по умолчанию вместо Юникода используется другая кодировка, они будут хранить символы в национальном наборе символов. А так как национальный набор символов поддерживает только кодировки UTF-8 и UTF- 16 , NCLOB , NCHAR и NVARCHAR2 гарантированно будут хранить данные в многобайтовом Юникоде.
Прежде это создавало проблемы при сравнении столбцов nclob/nchar/nvarchar2 со столбцами clob/char/varchar2 . Во всех версиях, поддерживаемых в настоящее время, Oracle выполняет автоматическое преобразование, благодаря которому становится возможным корректное сравнение.
Кодировка символов
Выбор набора символов во время создания базы данных определяет тип кодировки символов. Каждому символу ставится в соответствие код, уникальный для данного символа (кодовая точка). Это значение является частью таблицы отображения символов Юникода, содержимое которой находится под контролем Консорциума Юникода.
Кодовые точки состоят из префикса U+ (или обратной косой черты \ ), за которым следует шестнадцатеричный код символа с диапазоном допустимых значений от U+0000 до U+10FFFF16 . Комбинированные символы (например, А ) могут разбиваться на компоненты (A с умляутом), а затем снова восстанавливаться в своем исходном состоянии. Скажем, декомпозиция А состоит из кодовых точек U+0041 (A) и U+0308 (умляут). В следующем разделе будут рассмотрены некоторые функции Oracle для работы с кодовыми точками.
Кодовой единицей ( code unit ) называется размер в байтах типа данных, используемого для хранения символов. Размер кодовой единицы зависит от используемого набора символов. В некоторых обстоятельствах кодовая точка слишком велика для одной кодовой единицы, и для ее представления требуется несколько кодовых единиц.
Конечно, пользователи воспринимают символы, а не кодовые точки или кодовые единицы. «Слово» \0053\0074\0065\0076\0065\006E вряд ли будет понятно среднему пользователю, который распознает символы на своем родном языке. Не забывайте, что глиф (изображение символа, непосредственно отображаемое на экране) является всего лишь представлением кодового пункта. Даже если на вашем компьютере не установлены необходимые шрифты или он по другим причинам не может вывести символы на экран, это вовсе не означает, что в Oracle соответствующая кодовая точка хранится некорректно.
Параметры Globalization Support (NLS)
Поведение Oracle по умолчанию определяется параметрами Globalization Support (NLS) . Значения параметров, задаваемые при создании базы данных, определяют многие аспекты ее работы — от наборов символов до используемых по умолчанию денежных единиц. В табл. 1 перечислены параметры, которые вы можете изменить в ходе сеанса, с примерами значений и пояснениями. За текущими значениями параметров в вашей системе обращайтесь к представлению NLS_SESSI0N_PARAMETERS .
Таблица 1. Сеансовые параметры NLS
Параметр Описание Пример NLS_CALENDAR Задает календарь по умолчанию для базы данных GREGORIAN NLS_COMP В сочетании с NLS_SORT определяет правила сортировки символов. При использовании значения ANSI необходимо использовать лингвистический индекс BINARY NLS_CURRENCY Задает знак денежной единицы; по умолчанию
определяется на основании NLS_TERRITORY$ NLS_DATE_FORMAT Задает формат даты; по умолчанию определяется
на основании NLS_TERRITORYDD-MON-RR NLS_DATE_LANGUAGE Определяет способ записи дня и месяца для функций обработки дат AMERICAN NLS_DUAL_CURRENCY Упрощает поддержку евро; по умолчанию определяется на основании NLS_TERRITORY . Задает альтернативную денежную единицу для территории $ NLS_ISO_CURRENCY Символ денежной единицы ISO; по умолчанию
определяется на основании NLS_TERRITORYAMERICA NLS_LANGUAGE Задает язык, используемый базой данных по умолчанию. Значение влияет на многие аспекты, от формата даты до сообщений сервера AMERICAN NLS_LENGTH_SEMANTICS Определяет используемую семантику длины (символы или байты) BYTE NLS_NCHAR_CONV_EXCP Определяет, должно ли выдаваться сообщение об ошибке при преобразовании символьного типа FALSE NLS_NUMERIC_CHARACTERS Определяет разделители дробной части и групп
разрядов; по умолчанию определяется на основании NLS_TERRITORY., NLS_SORT Определяет порядок сортировки символов для заданного языка BINARY NLS_TERRITORY Определяет значения по умолчанию многих параметров NLS . Значение определяет основной регион базы данных AMERICA NLS_TIMESTAMP_FORMAT Определяет формат временной метки по умолчанию для функций TO_TIMESTAMP и TO_CHAR DD-MON-RR HH.MI.SSXF F AM NLS_TIMESTAMP_TZ_FORMAT Определяет формат временной метки с часовым
поясом для функций TO_TIMESTAMP и TO_CHARDD-MON-RR HH.MI.SSXF F AM TZR NLS_TIME_FORMAT Используется в сочетании с NLS_DATE_FORMAT
(см. выше). Задает формат времени по умолчанию
для базы данныхHH.MI.SSXF F AM NLS_TIME_TZ_FORMAT Определяет формат времени с часовым поясом или
смещением UTCHH.MI.SSXF F AM TZR Функции юникода
Поддержка Юникода в PL/SQL начинается с простейших строковых функций. Впрочем, в табл. 2 видны небольшие отличия этих функций от их хорошо известных аналогов.
К именам функций INSTR , LENGTH и SUBSTR добавляется суффикс B, C, 2 или 4; он означает, что функция работает с байтами, символами, кодовыми единицами или кодовыми точками соответственно.
Функции INSTR , LENGTH и SUBSTR используют семантику длины, связанную с типом данных столбца или переменной. Эти базовые функции и версии с суффиксом C часто возвращают одинаковые значения — до тех пор, пока вы не начнете работать со значениями NCHAR или NVARCHAR . Поскольку NLS_NCHAR_ CHARACTERSET и NLS_CHARACTERSET могут различаться, результат вызова INSTR , LENGTH и SUBSTR может отличаться (в зависимости от типа данных) от результата их символьных аналогов.
Таблица 2. Функции Юникода
Функция Юникода Описание ASCIISTR(string) Преобразует строку string в ASCn -символы. Строки в Юникоде преобразуются в стандартный формат \xxxx COMPOSE(string) Преобразует строку string, полученную в результате декомпозиции, в полную композиционную форму DECOMPOSE(string, [canonical | compatibility]) Получает строку string и возвращает строку Юникода, полученную разложением составных символов на кодовые INSTRB(string, substr, pos, occ) Возвращает позицию подстроки substr в строке string в байтах, начиная с позиции pos. Аргумент occ задает номер вхождения substr, если подстрока встречается более одного раза. По умолчанию аргументы pos и occ INSTRC(string, substr, pos, occ) Аналог INSTRB — за исключением того, что возвращает позицию substr в string в символах, начиная с позиции pos (значение pos задается в символах) INSTR2(string, substr, pos, occ) Возвращаемая позиция задается в кодовых единицах UTF -16 INSTR4(string, substr, pos, occ) Возвращаемая позиция задается в кодовых точках UTF -16 LENGTHB(string) Возвращает размер строки string в байтах LENGTHC(string) Возвращает длину строки string в символах Юникода LENGTH2(string) Возвращаемая длина задается в кодовых единицах UTF -16 LENGTH4(string) Возвращаемая длина задается в кодовых точках UTF -16 SUBSTRB(string, n, m) Возвращает часть строки string, состоящую из m символов, начиная
с позиции n. Значения n и m задаются в байтахSUBSTRC(string, n, m) Возвращает часть строки string, состоящую из m символов, начиная
с позиции n. Значения n и m задаются в символах ЮникодаSUBSTR2(string, n, m) Значения n и m задаются в кодовых единицах UTF -16 SUBSTR4(string, n, m) Значения n и m задаются в кодовых точках UTF -16 UNISTR Преобразует представление строки string из ASCII -формата (обрат-
ная косая черта, шестнадцатеричные цифры) в ЮникодРассмотрим эти функции подробнее.
ASCIISTR
ASCIISTR пытается преобразовать полученную строку в ASCII -символы. Если строка содержит символы, отсутствующие в наборе ASCII , они представляются в формате \xxxx . Как будет показано ниже при описании функции DECOMPOSE , такое форматирование иногда оказывается очень удобным.
BEGIN DBMS_OUTPUT.put_line ('ASCII Character: ' || ASCIISTR ('A')); DBMS_OUTPUT.put_line ('Unicode Character: ' || ASCIISTR ('Ä')); END;
ASCII Character: A Unicode Character: \00C4
COMPOSE
Некоторые символы могут иметь несколько вариантов представления кодовых пунктов. Это создает проблемы при сравнении двух значений. Символ А может быть представлен как одним кодовым пунктом U+00C4 , так и двумя кодовыми пунктами U+0041 (буква A) и U+0308. При сравнении PL/SQL считает, что эти два варианта представления не равны.
DECLARE v_precomposed VARCHAR2 (20) := UNISTR ('\00C4'); v_decomposed VARCHAR2 (20) := UNISTR ('A\0308'); BEGIN IF v_precomposed = v_decomposed THEN DBMS_OUTPUT.put_line ('==EQUAL=='); ELSE DBMS_OUTPUT.put_line ('<>NOT EQUAL<>'); END IF; END;
<>NOT EQUAL<>
Однако после использования функции COMPOSE эти две версии равны:
DECLARE v_precomposed VARCHAR2 (20) := UNISTR ('\00C4'); v_decomposed VARCHAR2 (20) := COMPOSE (UNISTR ('A\0308')); BEGIN IF v_precomposed = v_decomposed THEN DBMS_OUTPUT.put_line ('==EQUAL=='); ELSE DBMS_OUTPUT.put_line ('<>NOT EQUAL<>'); END IF; END;
На этот раз сравнение дает другой результат:
==EQUAL==
DECOMPOSE
Как нетрудно догадаться, функция DECOMPOSE является обратной по отношению к COMPOSE : она разбивает составные символы на отдельные кодовые точки или элементы:
DECLARE v_precomposed VARCHAR2 (20) := ASCIISTR (DECOMPOSE ('Ä')); v_decomposed VARCHAR2 (20) := 'A\0308'; BEGIN IF v_precomposed = v_decomposed THEN DBMS_OUTPUT.put_line ('==EQUAL=='); ELSE DBMS_OUTPUT.put_line ('<>NOT EQUAL<>'); END IF; END;
==EQUAL==
INSTR/INSTRB/INSTRC/INSTR2/INSTR4
Все функции INSTR возвращают позицию подстроки внутри строки и различаются лишь по способу определения позиции. Для демонстрации мы воспользуемся таблицей publication из схемы g11n .
DECLARE v_instr NUMBER (2); v_instrb NUMBER (2); v_instrc NUMBER (2); v_instr2 NUMBER (2); v_instr4 NUMBER (2); BEGIN SELECT INSTR (title, 'グ'), INSTRB (title, 'グ'), INSTRC (title, 'グ '), INSTR2 (title, 'グ'), INSTR4 (title, 'グ ') INTO v_instr, v_instrb, v_instrc, v_instr2, v_instr4 FROM publication WHERE publication_id = 2; DBMS_OUTPUT.put_line ('INSTR of グ: ' || v_instr); DBMS_OUTPUT.put_line ('INSTRB of グ: ' || v_instrb); DBMS_OUTPUT.put_line ('INSTRC of グ: ' || v_instrc); DBMS_OUTPUT.put_line ('INSTR2 of グ: ' || v_instr2); DBMS_OUTPUT.put_line ('INSTR4 of グ: ' || v_instr4); END; /
INSTR of グ: 16 INSTRB of グ: 20 INSTRC of グ: 16 INSTR2 of グ: 16 INSTR4 of グ: 16
Позиция символа У отличается только для INSTRB . Одна из полезных особенностей INSTR2 и INSTR4 заключается в том, что они могут использоваться для поиска кодовых точек, не представляющих полные символы. Возвращаясь к примеру с символом А, умляут можно включить как подстроку для выполнения поиска.
LENGTH/LENGTHB/LENGTHC/LENGTH2/LENGTH4
Функции LENGTH возвращают длину строки в разных единицах:
LENGTH — возвращает длину строки в символах;
LENGTHB — возвращает длину строки в байтах;
LENGTHC — возвращает длину строки в символах Юникода;
LENGTH2 — возвращает количество кодовых единиц в строке;
LENGTH4 — возвращает количество кодовых точек в строке.
Если строка состоит из композиционных символов, функция LENGTH эквивалентна LENGTHC .
DECLARE v_length NUMBER (2); v_lengthb NUMBER (2); v_lengthc NUMBER (2); v_length2 NUMBER (2); v_length4 NUMBER (2); BEGIN SELECT LENGTH (title), LENGTHB (title), lengthc (title), length2 (title), length4 (title) INTO v_length, v_lengthb, v_lengthc, v_length2, v_length4 FROM publication WHERE publication_id = 2; DBMS_OUTPUT.put_line ('LENGTH of string: ' || v_length); DBMS_OUTPUT.put_line ('LENGTHB of string: ' || v_lengthb); DBMS_OUTPUT.put_line ('LENGTHC of string: ' || v_lengthc); DBMS_OUTPUT.put_line ('LENGTH2 of string: ' || v_length2); DBMS_OUTPUT.put_line ('LENGTH4 of string: ' || v_length4); END;
LENGTH of string: 28 LENGTHB of string: 52 LENGTHC of string: 28 LENGTH2 of string: 28 LENGTH4 of string: 28
В данном примере только функция LENGTHB дает другой результат. Как и ожидалось, LENGTH и LENGTHC вернули одинаковые результаты. Впрочем, при работе с декомпозиционными символами ситуация меняется. Пример:
DECLARE v_length NUMBER (2); BEGIN SELECT LENGTH (UNISTR ('A\0308')) INTO v_length FROM DUAL; DBMS_OUTPUT.put_line ('Decomposed string size using LENGTH: ' || v_length); SELECT lengthc (UNISTR ('A\0308')) INTO v_length FROM DUAL; DBMS_OUTPUT.put_line ('Decomposed string size using LENGTHC: ' || v_length); END;
Функции возвращают следующие значения длины:
Decomposed string size using LENGTH: 2 Decomposed string size using LENGTHC: 1
Функция LENGTH возвращает количество символов, но считает A и умляут разными символами. LENGTHC возвращает длину в символах Юникода и видит только один символ.
SUBSTR/SUBSTRB/SUBSTRC/SUBSTR2/SUBSTR4
Разные версии SUBSTR определяются по тому же принципу, что и их аналоги у функций INSTR с LENGTH . SUBSTR возвращает часть строки заданной длины начиная с заданной позиции. Функции этого семейства работают следующим образом:
SUBSTR — определяет позицию и длину по символу;
SUBSTRB — определяет позицию и длину в байтах;
SUBSTRC — определяет позицию и длину в символах Юникода;
SUBSTR2 — использует кодовые единицы;
SUBSTR4 — использует кодовые точки.
Использование этих функций продемонстрировано в следующем примере:
DECLARE v_substr VARCHAR2 (20); v_substrb VARCHAR2 (20); v_substrc VARCHAR2 (20); v_substr2 VARCHAR2 (20); v_substr4 VARCHAR2 (20); BEGIN SELECT SUBSTR (title, 13, 4), SUBSTRB (title, 13, 4), substrc (title, 13, 4), substr2 (title, 13, 4), substr4 (title, 13, 4) INTO v_substr, v_substrb, v_substrc, v_substr2, v_substr4 FROM publication WHERE publication_id = 2; DBMS_OUTPUT.put_line ('SUBSTR of string: ' || v_substr); DBMS_OUTPUT.put_line ('SUBSTRB of string: ' || v_substrb); DBMS_OUTPUT.put_line ('SUBSTRC of string: ' || v_substrc); DBMS_OUTPUT.put_line ('SUBSTR2 of string: ' || v_substr2); DBMS_OUTPUT.put_line ('SUBSTR4 of string: ' || v_substr4); END;
Обратите внимание на отличие SUBSTRB от других функций в результатах выполнения сценария:
SUBSTR of string: Lプログ SUBSTRB of string: Lプ SUBSTRC of string: Lプログ SUBSTR2 of string: Lプログ SUBSTR4 of string: Lプログ
UNISTR
Функция UNISTR преобразует строку в Юникод. Эта функция использовалась в ряде предыдущих примеров для вывода символов строки, подвергнутой декомпозиции. В разделе «Кодировка символов» в качестве примера была приведена строка, состоящая из кодовых пунктов. Чтобы привести ее к понятному виду, можно воспользоваться функцией UNISTR :
DECLARE v_string VARCHAR2 (20); BEGIN SELECT UNISTR ('\0053\0074\0065\0076\0065\006E') INTO v_string FROM DUAL; DBMS_OUTPUT.put_line (v_string); END;
Steven
Как изменить кодировку в БД?
Имеется БД Oracle, в которой nls_lang установленa как russian_russia . Необходимо поменять кодировку на american . Проверяю кодировку так:
select * from nls_database_parameters
Пробовал изменить реестр и установить кодировку, что мне нужна. Пробовал прописать set nls_lang = american_america , но ничего не работает. Переустанавливать не хочется. Может есть работающие алгоритмы смены кодировки?
Отслеживать
51.6k 199 199 золотых знаков 59 59 серебряных знаков 242 242 бронзовых знака
задан 6 окт 2016 в 13:16
2,434 3 3 золотых знака 26 26 серебряных знаков 42 42 бронзовых знака1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Установкой переменной окружения NLS_LANG изменится окружение только для клиентских программ. Никаких изменений в БД при этом не произойдёт.
Значение american_america установит NLS_LANGUAGE и NLS_TERRITORY для текушего соединения клиентской программы. Ни к кодировке установленной в клиенте, ни тем более установленной в БД, эти два параметра не имеют никакого отношения.
Переменная NLS_LANG не используется в серверной части БД. Для изменения национальных настроек надо в файле параметров БД init.ora прописать отдельно:
- NLS_LANGUAGE — язык
- NLS_TERRITORY -территории
- NLS_CHARACTERSET — кодировка
Кодировкa устанавливается только параметром NLS_CHARACTERSET .
Уже установленную кодировку можно изменить только, если новая кодировка является строгим супермножеством старой кодировки.
Например, нельзя поменять WE8ISO8859P5 на AL32UTF8 , а US7ASCII на любую можно всегда.Если повезло, то alter database character set AL32UTF8; .
Если нет — миграция данных и в худшем случае программ, которые не совсем понимают новую кодировку.Подробнее читаем документацию, или в общих чертах по-русски тут.
Oracle — Смена кодировки
Была необходимость изменить кодировку базы данных Oracle. Для этого нужно выполнить некий набор операций, который описан ниже:
- Подключимся к базе из под oracle пользователя:
sqlplus /nolog conn / as sysdba
Code language: JavaScript (javascript)- последовательно выполним команды
КОДИРОВКА>
= CL8MSWIN1251 SHUTDOWN IMMEDIATE; STARTUP MOUNT; ALTER SYSTEM ENABLE RESTRICTED SESSION; ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0; ALTER SYSTEM SET AQ_TM_PROCESSES=0; ALTER DATABASE OPEN; ALTER DATABASE CHARACTER SET INTERNAL_USE КОДИРОВКА>; ALTER DATABASE CHARACTER SET КОДИРОВКА>; SHUTDOWN IMMEDIATE; STARTUP;Code language: HTML, XML (xml)- Если необходимо сменить территорию и тип язык:
ALTER SYSTEM SET NLS_LANGUAGE='AMERICAN' SCOPE=spfile; ALTER SYSTEM SET NLS_TERRITORY='AMERICA' SCOPE=spfile;
Code language: JavaScript (javascript)Перезапустить cлужбу оракла.
Похожие темы:
- Идемпотентность DML
- Git — как переименовать ветку?
- Как удалить папки .@__thumb в Qnap?
- Как отключить генерацию .@__thumb папки в Qnap?
- How to show separate lines in Notepad++ when there is /r/n in the text (en)?
- Как в Notepad++ заменить /r/n на новую строку?
Oracle кодировка базы как посмотреть
При инсталляции, редакция Oracle Database 11g Express Edition ставит базу данных с набором символов по умолчанию AL32UTF8. Это конечно сильно сокращает максимальный размер и так небольшого лимитируемого табличного пространства в 11 Гб. В данном NLS наборе для кодировки русских символов используется два байта:
SQL> SELECT DUMP('Я', 1017) FROM dual; DUMP('Я',1017) ----------------------------------------- Typ=96 Len=2 CharacterSet=AL32UTF8: d0,af
Приходится увеличивать вдвое размер символьных столбцов. Это в свою очередь ведёт к увеличению занятого табличного пространства и создаёт сложности в использовании утилит экспорта импорта при перекачке данных.
Если применять набор символов Unicode не планируется, то можно попробовать пересоздать базу данных в необходимой нам однобайтной кодировке. Посмотрим на примере, как это делается. Считаем, что Oracle Database 11g Express Edition у нас проинсталлирована по умолчанию.
Для начала установим переменную ORACLE_HOME и подключимся к экземпляру как sys:
C:\oraclexe\app\oracle>SET ORACLE_HOME=c:\oraclexe\app\oracle\product\11.2.0\server C:\oraclexe\app\oracle>c:\oraclexe\app\oracle\product\11.2.0\server\bin\sqlplus /nolog SQL*Plus: Release 11.2.0.2.0 Production on ?э ?рЁ 26 22:03:46 2012 Copyright (c) 1982, 2010, Oracle. All rights reserved. SQL> connect sys as sysdba Enter password: Connected.
Остановим базу данных и снова её запустим, но уже в смонтированном монопольном режиме и с ограничением по подключению:
SQL> shutdown immediate; Database closed. Database dismounted. ORACLE instance shut down. SQL> startup restrict mount exclusive; ORACLE instance started. Total System Global Area 535662592 bytes Fixed Size 1384760 bytes Variable Size 226496200 bytes Database Buffers 301989888 bytes Redo Buffers 5791744 bytes Database mounted.
Теперь удалим базу данных:
SQL> drop database; Database dropped. Disconnected from Oracle Database 11g Express Edition Release 11.2.0.2.0 – Production
Старая база данных у нас удалена, можно приступать к созданию новой. Но прежде чем это сделать, проделаем два небольших действия.
Первое, это создадим или скопируем файл инициализационных параметров initXE.ora в каталог c:\oraclexe\app\oracle\product\11.2.0\server\database. Второе, скачаем этот архив и распакуем его в каталог C:\oraclexe\app\oracle\product\11.2.0\server\rdbms\xml, зачем, об этом немного позже.
Все необходимые файлы скопированы, подключаемся к экземпляру и стартуем его с нашим файлом инициализации initXE.ora:
SQL> connect sys as sysdba Enter password: Connected to an idle instance. SQL> startup nomount pfile=c:\oraclexe\app\oracle\product\11.2.0\server\database\initXE.ora ORACLE instance started. Total System Global Area 535662592 bytes Fixed Size 1384760 bytes Variable Size 226496200 bytes Database Buffers 301989888 bytes Redo Buffers 5791744 bytes
Создаём базу данных следующей командой, указав в ней необходимый нам набор символов (строка character set cl8mswin1251):
SQL> create database 2 maxinstances 1 3 maxloghistory 2 4 maxlogfiles 16 5 maxlogmembers 2 6 maxdatafiles 30 7 datafile 'c:\oraclexe\app\oracle\oradata\XE\system.dbf' 8 size 200M reuse autoextend on next 10M maxsize 600M 9 extent management local 10 sysaux datafile 'c:\oraclexe\app\oracle\oradata\XE\sysaux.dbf' 11 size 10M reuse autoextend on next 10M 12 default temporary tablespace temp tempfile 'c:\oraclexe\app\oracle\oradata\XE\temp.dbf' 13 size 20M reuse autoextend on next 10M maxsize 500M 14 undo tablespace undotbs1 datafile 'c:\oraclexe\app\oracle\oradata\XE\undotbs1.dbf' 15 size 50M reuse autoextend on next 5M maxsize 500M 16 character set cl8mswin1251 17 national character set al16utf16 18 set time_zone='00:00' 19 controlfile reuse 20 logfile 'c:\oraclexe\app\oracle\oradata\XE\log1.dbf' size 50m reuse 21 , 'c:\oraclexe\app\oracle\oradata\XE\log2.dbf' size 50m reuse 22 , 'c:\oraclexe\app\oracle\oradata\XE\log3.dbf' size 50m reuse 23 user system identified by oracle 24 user sys identified by oracle 25 / Database created.
База данных в нужной нам кодировке создана. Добавим к ней табличное пространство USERS:
SQL> create tablespace users 2 datafile 'c:\oraclexe\app\oracle\oradata\XE\users.dbf' 3 size 100M reuse autoextend on next 10M maxsize 11G 4 extent management local 5 / Tablespace created.
Запускаем на выполнение следующие скрипты:
-- Создаёт словарь базы данных SQL>@c:\oraclexe\app\oracle\product\11.2.0\server\rdbms\admin\catalog.sql -- Создаёт дополнительные представления по блокировкам Oracle SQL>@c:\oraclexe\app\oracle\product\11.2.0\server\rdbms\admin\catblock -- Создаёт дополнительные типы, таблицы, представления, процедуры, пакеты SQL>@c:\oraclexe\app\oracle\product\11.2.0\server\rdbms\admin\catproc -- Создаёт объекты для поддержки криптографии SQL>@c:\oraclexe\app\oracle\product\11.2.0\server\rdbms\admin\catoctk -- Создаёт таблицу PRODUCT_USER_PROFILE для SQL*Plus SQL>@c:\oraclexe\app\oracle\product\11.2.0\server\sqlplus\admin\pupbld
Перезапускаем базу данных:
SQL> connect sys as sysdba Enter password: Connected. SQL> shutdown immediate; Database closed. Database dismounted. ORACLE instance shut down. SQL> startup; ORACLE instance started. Total System Global Area 535662592 bytes Fixed Size 1384760 bytes Variable Size 226496200 bytes Database Buffers 301989888 bytes Redo Buffers 5791744 bytes Database mounted. Database opened.
Смотрим значения параметров NLS базы данных:
SQL> SELECT * FROM NLS_DATABASE_PARAMETERS PARAMETER VALUE ----------------------- ---------------------------- NLS_LANGUAGE AMERICAN NLS_TERRITORY AMERICA NLS_CURRENCY $ NLS_ISO_CURRENCY AMERICA NLS_NUMERIC_CHARACTERS ., NLS_CHARACTERSET CL8MSWIN1251 NLS_CALENDAR GREGORIAN NLS_DATE_FORMAT DD-MON-RR NLS_DATE_LANGUAGE AMERICAN NLS_SORT BINARY NLS_TIME_FORMAT HH.MI.SSXFF AM NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR NLS_DUAL_CURRENCY $ NLS_COMP BINARY NLS_LENGTH_SEMANTICS BYTE NLS_NCHAR_CONV_EXCP FALSE NLS_NCHAR_CHARACTERSET AL16UTF16 NLS_RDBMS_VERSION 11.2.0.2.0
Как видим, созданная вновь база данных имеет однобайтовый набор символов (NLS_CHARACTERSET CL8MSWIN1251). Что нам и надо было получить.
SQL> SELECT DUMP('Я', 1017) FROM dual; DUMP('Я',1017) ------------------------------------------ Typ=96 Len=1 CharacterSet=CL8MSWIN1251: df
Напоследок хочется сказать о том, зачем надо было распаковывать файлы из архива xsl.rar в каталог C:\oraclexe\app\oracle\product\11.2.0\server\rdbms\xml. Если это не сделать до выполнения скрипта catproc, то потом окажется, что утилита Oracle Data Pump Export (expdp) отказывается работать, выдавая ошибку:
Connected to: Oracle Database 11g Express Edition Release 11.2.0.2.0 - Production ORA-39006: internal error ORA-39213: Metadata processing is not available
Если вы забыли скопировать файлы архива до выполнения скрипта, то ничего страшного, это можно сделать и позже. Единственное, надо не забыть выполнить после этого процедуру LOD_STYLESHEETS пакета DBMS_METADATA_UTIL:
SQL> exec dbms_metadata_util.load_stylesheets; PL/SQL procedure successfully completed.
Самое популярное
- Практическое администрирование Oracle — Аудит. Часть1.
- RMAN в примерах — Быстрый старт. Глава 1.
- RMAN В ПРИМЕРАХ — Использование RMAN. Глава 3. Часть 2
- RMAN В ПРИМЕРАХ — Конфигурирование окружения RMAN. Глава 4. Часть 1.
- Дублирование базы данных с помощью RMAN. Часть 1.