Средства интернационализации

СУБД ЛИНТЕР позволяет хранить символьную информацию в кодировке, задаваемой пользователем БД.

Это позволяет пользователю отправлять СУБД и получать от нее символьные данные в заданной кодировке (без преобразования), а также в других кодировках, для которых СУБД может автоматически выполнить (при необходимости) преобразование пользовательских данных в заданную кодировку.

По умолчанию в СУБД ЛИНТЕР включена поддержка следующих кодовых страниц:

  • кириллические однобайтовые: CP866, KOI8-R, CP1251;

  • европейские однобайтовые CP437, CP850, CP1252, и с ISO 8859-1 по ISO 8859-16;

  • многобайтовые: CP932 (Japanese Shift-JIS), CP936 (Simplified Chinese GBK), CP949 (Korean), CP950 (Traditional Chinese Big5), EUC Japanese;

  • UTF-8.

Кроме перечисленных кодовых страниц, в СУБД можно загружать любую необходимую пользователю кодовую страницу.

СУБД ЛИНТЕР для хранения информации о кодовых страницах создает в БД служебные таблицы $$$CHARSET и $$$TRANSL, входящие в системный словарь БД.

Таблица $$$CHARSET используется для хранения кодовых страниц. Она содержит информацию о коде страницы, о свойствах страницы, о «весах» символов кодовой страницы и т.п. Таблица трансляции ($$$TRANSL) хранит информацию о взаимном преобразовании однобайтовых кодовых страниц. Системные таблицы $$$CHARSET и $$$TRANSL создаются при выполнении SQL-скрипта cstables.sql.

СУБД ЛИНТЕР позволяет назначить кодировку:

  • всей БД, т.е. данные во всех пользовательских таблицах, для которых их кодировка и кодировка их столбцов не задана явно, будут храниться в указанной кодировке;

  • системным таблицам, т.е. данные во всех системных таблицах будут храниться в указанной кодировке;

  • отдельной таблице БД, т.е. данные всех столбцов конкретной таблицы будут храниться в одной заданной кодировке;

  • столбцам таблицы, т.е. данные в разных столбцах конкретной таблицы могут храниться в различных кодировках;

  • каналу, по которому обмениваются данными СУБД ЛИНТЕР и клиентское приложение. Клиентское приложение будет получать запрашиваемые из БД данные в той кодировке, которая установлена для канала, по которому послан запрос. Если кодировка канала явно не задана, то данные будут представлены в кодировке по умолчанию, установленной в операционной системе (для Windows соответствующей текущему значению locale).

Установка требуемых кодировок выполняется с помощью соответствующих SQL-запросов.

Перекодировкой данных занимается ядро СУБД ЛИНТЕР. Для исключения дополнительной работы при перекодировке данных используется таблица трансляции. В случае отсутствия ее в СУБД она генерируется динамически – через таблицу UNICODE-символов.

Многобайтовые кодовые страницы хранятся в виде своих составляющих – набора однобайтовых кодовых страниц и при загрузке в СУБД «собираются» в единое целое с целью получения общей таблицы трансляции в/из UNICODE.

СУБД ЛИНТЕР может использовать разные кодовые страницы для системных словарей и пользовательских таблиц.

В только что созданной БД используется интегрированная кодовая страница 20127 (US-ASCII), имеющая имя «DEFAULT» (кодовая страница по умолчанию для системного словаря) и содержащая 127 символов. В символах этой кодовой страницы хранятся метаданные БД: названия таблиц, столбцов, триггеров, процедур и т.д. При необходимости может быть установлена другая однобайтовая кодовая страница по умолчанию для системного словаря.

Аналогично в БД может быть задана кодовая страница по умолчанию для хранения данных пользовательских таблиц. Если она явно не установлена, используется кодовая страница по умолчанию для системного словаря.

Для нормальной работы с кодовой страницей рекомендуется явно задать ее на клиентской части. Проще всего это можно сделать с помощью переменной окружения LINTER_CP.

Данные в столбцах в произвольной национальной кодовой странице могут храниться двумя способами:

  1. в текстовых столбцах таблиц с заданной национальной кодовой страницей;

  2. в UNICODE-столбцах таблиц.

В качестве длин текстовых полей указывается их размер в символах.

Поскольку хранение многобайтовых кодовых страниц требует существенного объема оперативной памяти, то внутри СУБД такие страницы хранятся в отдельной очереди, которая по умолчанию не инициализирована. Ее инициализация происходит только в результате занесения в таблицу $$$CHARSET первой многобайтовой кодовой страницы и последующего перезапуска СУБД ЛИНТЕР.