Средства интернационализации
СУБД ЛИНТЕР позволяет хранить символьную информацию в кодировке, задаваемой пользователем БД.
Это позволяет пользователю отправлять СУБД и получать от нее символьные данные в заданной кодировке (без преобразования), а также в других кодировках, для которых СУБД может автоматически выполнить (при необходимости) преобразование пользовательских данных в заданную кодировку.
По умолчанию в СУБД ЛИНТЕР включена поддержка следующих кодовых страниц:
-
кириллические однобайтовые: 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
.
Данные в столбцах в произвольной национальной кодовой странице могут храниться двумя способами:
-
в текстовых столбцах таблиц с заданной национальной кодовой страницей;
-
в UNICODE-столбцах таблиц.
В качестве длин текстовых полей указывается их размер в символах.
Поскольку хранение многобайтовых кодовых страниц требует
существенного объема
оперативной памяти, то внутри СУБД такие страницы хранятся в отдельной очереди,
которая по умолчанию не инициализирована. Ее инициализация
происходит только в
результате занесения в таблицу
$$$CHARSET
первой многобайтовой
кодовой страницы и последующего перезапуска СУБД ЛИНТЕР.