DEFAULT CHARACTER SET WIN1251;
Более подробную информацию об операторе CREATE DATABASE см. в главе 12.
Атрибут набора символов может быть добавлен к индивидуальному определению домена, столбца таблицы или переменной PSQL типа CHAR, VARCHAR или BLOB SUB_TYPE 1 для перекрытия набора символов по умолчанию базы данных.
Например, следующий фрагмент скрипта создает базу данных с набором символов по умолчанию ISO8859_1 и таблицу, содержащую различные версии языка похожих данных в отдельных столбцах:
CREATE DATABASE '/data/authors.fdb' DEFAULT CHARACTER SET ISO8859_1;
CREATE TABLE COUNTRY_INTL(
CNTRYCODE BIGINT NOT NULL,
NOM_FR VARCHAR(30) NOT NULL,
/* использует набор символов по умолчанию */
NOM_EN VARCHAR(30), /* использует набор символов по умолчанию */
NOM_RU VARCHAR(30) CHARACTER SET WINI251,
NOM_JP VARCHAR(30) CHARACTER SET SJIS_0208
Другой фрагмент того же скрипта создает домен для хранения данных BLOB В наборе символов кириллицы:
CREATE DOMAIN MEMO_RU AS BLOB SUB_TYPE 1
CHARACTER SET WIN1251;
Позже в этом скрипте мы создаем таблицу, которая хранит некоторый текст в кириллице:
CREATE TABLE NOTES_RU (
DOC_ID BIGINT NOT NOLL,
NOTES MEMO_RU
);
Следующий фрагмент определяет хранимую процедуру, которая преобразует входную строку в другой набор символов перед сохранением ее в таблице:
CREATE PROCEDURE CONVERT_NOTES (
INPUT_TEXT VARCHAR(300) ) AS
DECLARE VARIABLE CONV_STRING WARCHAR(300)
CHARACTER SET WIN1251;
BEGIN
IF (INPUT JTEXT IS NOT NULL) THEN
BEGIN
CONV_STRING = _WIN1251 ' ' || : INPUT_TEXT;
/* использует INTRODUCER */
INSERT INTO NOTES_RU (DOC_ID, NOTES)
VALUES (GEN_ID (ANYGEN, 1) , :CONV_STRING) ;
END
END ^
Создание доменов объясняется в главе 13. Полный синтаксис оператора CREATE TABLE описан в главе 15. Объявление переменных в PSQL см. в главе 30.
Набор символов для текстовых значений в операторе интерпретируется в соответствии с набором символов соединения в процессе выполнения (а не в соответствии с набором символов, определенным для столбца при его создании), если только вы не зададите маркер набора символов (или "представитель") для указания другого набора символов.
Маркер набора символов - также известный как INTRODUCER- состоит из имени набора символов, перед которым стоит символ подчеркивания. Он требуется для "представления" входной строки, когда приложение клиента соединено с базой данных с использованием набора символов, отличного оттого, который определен для столбца в базе данных.
Установите маркер слева от отмечаемого текстового значения. Например, маркером для ввода в UMCODE_FSS поле является _UNICODE_FSS:
INSERT INTO EMPLOYEE(Emp_ID, Emp_Name)
values(1234, _UNICODE_ESS 'Smith, John Joseph');
! ! !
СОВЕТ. Для ясности вы можете вставить пробел между маркером и строкой без какого-либо влияния на способ синтаксического анализа вводимого данного.
. ! .
Строковый литерал в условии проверки или поиска, например в предложении WHERE, интерпретируется в соответствии с набором символов клиентского соединения в момент проверки условия. Маркер потребуется, когда отыскиваемый столбец базы данных имеет набор символов, отличный от того, который был указан в клиентском соединении:
... WHERE name = _ISO8859_1 'joe';
! ! !
СОВЕТ. Когда вы разрабатываете приложение со смешанными наборами символов, то удобно использовать маркеры, особенно если ваше приложение будет работать со многими базами данных и/или будет распространяться интернационально.
. ! .
Преобразование символов из одного набора символов Firebird в другой - например, конвертирование из DOS437 в ISO8859_1 - является транслитерацией. Транслитерация в Firebird сохраняет точность символов: по определению она не подставляет никакого "заменителя" для входного символа, который не представлен в выходном наборе символов. Назначением такого ограничения является гарантия того, что возможна транслитерация одного и того же текста из одного набора символов в другой в любом направлении без потери символов в процессе транслитерации.
Firebird выдает сообщение об ошибке, если символ во входном наборе не имеет точного представления в выходном наборе.
Пример, где может появиться ошибка транслитерации: когда приложение передает данные некоторого неопределенного набора символов в столбец, определенный с NONE, и позже пытается выбрать эти данные и поместить в другой столбец, который был определен с отличающимся набором символов. Хотя вы думаете, что это должно работать, потому что образы символов, похоже, принадлежат набору символов столбца назначения, транслитерация будет ошибочной, поскольку символ не представлен в наборе символов столбца назначения.