Spec-Zone.ru › MariaDB

Подключение DOS и FIX типов таблиц

Обзор

Таблицы типа DOS и FIX основаны на текстовых файлах (см. Типы таблиц CONNECT - Файлы данных). Внутри записи поля столбцов расположены с фиксированным смещением от начала записи. За исключением иногда последнего поля, поля столбцов также имеют фиксированную длину. Если последнее поле имеет переменную длину, тип таблицы - DOS. Например, имея файл dept.dat, отформатированный как:

0318 KINGSTON       70012 SALES       Bank/Insurance
0021 ARMONK         87777 CHQ         Corporate headquarter
0319 HARRISON       40567 SALES       Federal Administration
2452 POUGHKEEPSIE   31416 DEVELOPMENT Research & development

Вы можете определить таблицу на его основе с помощью:

create table department (
  number char(4) not null,
  location char(15) not null flag=5,
  director char(5) not null flag=20,
  function char(12) not null flag=26,
  name char(22) not null flag=38)
engine=CONNECT table_type=DOS file_name='dept.dat';

Здесь параметр column option представляет собой смещение этого столбца внутри записей. Если смещение столбца не указано, оно по умолчанию устанавливается в конец предыдущего столбца и по умолчанию равно 0 для первого. Параметр lrecl, представляющий максимальный размер записи, по умолчанию вычисляется как конец самого правого столбца и может быть не указан, за исключением случаев, когда после самого правого столбца существует какая-либо дополнительная информация.

Примечание: Специальный случай - файлы с кодировкой, например, UTF-8 (например, указание charset=UTF8), в которой некоторые символы могут быть представлены несколькими байтами. В отличие от размера типа, который MariaDB интерпретирует как количество символов, значение lrecl - это размер записи в байтах, а значение флага представляет смещение поля в записи в байтах. Если флаг и/или значение lrecl не указаны, они будут вычислены по количеству символов в полях, умноженному на значение, которое является максимальным размером в байтах символа для соответствующей кодировки. Для UTF-8 это значение равно 3, что часто бывает слишком много, так как очень мало символов требуют 3 байта для представления. При создании нового файла вы можете быть уверены, что достаточно просто удвоить максимальное количество символов поля для вычисления смещения следующего поля. Конечно, для уже существующих файлов смещение должно быть указано в соответствии с тем, что оно есть в нем.

Хотя представление поля всегда текстовое в файле таблицы, вы можете свободно выбирать соответствующий тип столбца: символы, дата, целое или число с плавающей точкой в соответствии с его содержимым.

Иногда, как в столбце number приведенной выше таблицы department, у вас есть выбор типа: числовой или символьный. Это изменит способ внутренней обработки столбца — в символах 0021 отличается от 21, но не в числовом —, а также то, как он отображается.

Если последнее поле имеет фиксированную длину, таблица должна упоминаться как имеющая тип FIX. Например, чтобы создать таблицу по файлу boys.txt:

John      Boston      25/01/1986  02/06/2010
Henry     Boston      07/06/1987  01/04/2008
George    San Jose    10/08/1981  02/06/2010
Sam       Chicago     22/11/1979  10/10/2007
James     Dallas      13/05/1992  14/12/2009
Bill      Boston      11/09/1986  10/02/2008

Вы можете, например, использовать команду:

create table boys (
  name char(12) not null,
  city char(12) not null,
  birth date not null date_format='DD/MM/YYYY',
  hired date not null date_format='DD/MM/YYYY' flag=36)
engine=CONNECT table_type=FIX file_name='boys.txt' lrecl=48;

Здесь некоторые параметры flag не были указаны, потому что поля не имеют промежуточных пробелов между ними, за исключением последнего столбца. Смещения вычисляются по умолчанию, добавляя длину поля к смещению предыдущего поля. Однако для отформатированных столбцов даты смещение в файле зависит от формата и не может быть вычислено по умолчанию. Для фиксированных файлов параметр lrecl - это физическая длина записи, включая символ(ы) конца строки. Он вычисляется путем добавления в конец последнего поля 2 байтов в Windows (CRLF) или 1 байта в UNIX. Если файл импортируется из другой операционной системы, параметр ENDING должен быть указан с правильным значением.

Для этой таблицы последнее смещение и длина записи должны быть указаны в любом случае, поскольку столбцы даты имеют длину поля, получаемую из их формата, который не известен CONNECT. Не забудьте добавить длину конца строки к общей длине полей.

Эта таблица отображается как:

name city birth hired
John Boston 1986-01-25 2010-06-02
Henry Boston 1987-06-07 2008-04-01
George San Jose 1981-08-10 2010-06-02
Sam Chicago 1979-11-22 2007-10-10
James Dallas 1992-05-13 2009-12-14
Bill Boston 1986-09-11 2008-02-10

Всякий раз, когда это возможно, фиксированный формат следует предпочитать переменному, поскольку работать с фиксированными таблицами намного быстрее, чем с переменными таблицами. Конечно, вместо построчного чтения или записи таблицы FIX обрабатываются блоками из BLOCK_SIZE записей, что приводит к значительно меньшему количеству операций ввода-вывода. Размер блока по умолчанию равен 100, если он не указан в операторе Create Table.

Примечание 1: Необязательно объявлять в таблице все поля, существующие в исходном файле. Однако, если некоторые поля игнорируются, параметр flag следующего поля и/или параметр lrecl должны быть указаны.

Примечание 2: Некоторые файлы имеют маркер EOF (CTRL+Z 1A), который может помешать распознаванию таблицы как фиксированной, поскольку длина файла не кратна размеру фиксированной записи. Чтобы указать это, используйте в списке параметров параметр create EOF. Например, если после создания таблицы FIX xtab в файле foo.dat, о котором вы знаете, что он имеет фиксированный размер записи, вы получаете при попытке его использования сообщение, например:

File foo.dat is not fixed length, len=302587 lrecl=141

После проверки правильности указанного по умолчанию или указанного спецификации LRECL вы можете указать игнорировать этот дополнительный символ EOF с помощью:

alter table xtab option_list='eof=1';

Конечно, вы можете указать этот параметр непосредственно в операторе Create. Все это относится к некоторым другим типам таблиц, в частности, к таблицам BIN.

Примечание 3: Ширина полей - это длина, указанная в объявлении столбца. Например, для столбца, объявленного как:

number int(3) not null,

Ширина поля в файле составляет 3 символа. Это значение используется для вычисления смещения следующего поля, если оно не указано. Если эта длина не указана, по умолчанию используется длина типа по умолчанию MySQL.

Указание формата поля

Некоторые файлы имеют специфический формат для своих числовых полей. Например, десятичная точка отсутствует и/или поле должно быть заполнено ведущими нулями. Для работы с такими файлами, как при чтении, так и при записи, формат может быть указан в определении столбца CREATE TABLE. Синтаксис спецификации формата поля:

Field_format='[Z][N][d]'

Необязательные части формата:

Z Поле имеет ведущие нули
N Десятичной точки в файле нет
d Количество десятичных знаков, по умолчанию - точность столбца

Пример

Давайте посмотрим, как это работает в следующем примере. Мы определяем таблицу на основе файла xfmt.txt, имеющего восемь полей по 12 символов:

create table xfmt (
  col1 double(12,3) not null,
  col2 double(12,3) not null field_format='4',
  col3 double(12,2) not null field_format='N3',
  col4 double(12,3) not null field_format='Z',
  col5 double(12,3) not null field_format='Z3',
  col6 double(12,5) not null field_format='ZN5',
  col7 int(12) not null field_format='N3',
  col8 smallint(12) not null field_format='N3')
engine=CONNECT table_type=FIX file_name='xfmt.txt';

insert into xfmt values(4567.056,4567.056,4567.056,4567.056,-23456.8,
    3.14159,4567,4567);
select * from xfmt;

Первая строка отображается как:

COL1 COL2 COL3 COL4 COL5 COL6 COL7 COL8
4567.056 4567.056 4567.06 4567.056 -23456.800 3.14159 4567 4567

Количество отображаемых десятичных знаков для всех столбцов с плавающей точкой - это точность столбца, второй аргумент параметра типа столбца. Конечно, целые столбцы не имеют десятичных знаков, хотя их форматы указывают некоторые.

Более интересна структура файла. Чтобы увидеть это, давайте определим другую таблицу на основе того же файла, но столбцы которой являются символами:

create table cfmt (
  col1 char(12) not null,
  col2 char(12) not null,
  col3 char(12) not null,
  col4 char(12) not null,
  col5 char(12) not null,
  col6 char(12) not null,
  col7 char(12) not null,
  col8 char(12) not null)
engine=CONNECT table_type=FIX file_name='xfmt.txt';
select * from cfmt;

Транспонированное отображение команды select показывает текстовую структуру файла для каждого поля. Ниже в этот документ был добавлен третий столбец для комментирования этого результата.

Column Row 1 Comment (all numeric fields are written right justified)
COL1 4567.056 Без формата, значение было введено как есть.
COL2 4567.0560 Формат ‘4’ принуждает записывать 4 десятичных знака.
COL3 4567060 N3 → Нет десятичной точки. Последние 3 цифры - десятичные. Однако второй десятичный знак был округлен из-за точности столбца.
COL4 00004567.056 Z → Ведущие нули, 3 десятичных знака (точность столбца)
COL5 -0023456.800 Z3 → (Знак минус) ведущие нули, 3 десятичных знака.
COL6 000000314159 ZN5 → Ведущие нули, нет десятичной точки, 5 десятичных знаков.
COL7 4567000 N3 → Нет десятичной точки. Последние 3 цифры - десятичные.
COL8 4567000 То же самое. Любые десятичные знаки будут игнорироваться.

Примечание: Для столбцов, использующих внутренне числа с плавающей точкой двойной точности, MariaDB ограничивает десятичную точность любого вычисления точностью столбца. Объявленная точность столбца должна быть не менее количества десятичных знаков формата, чтобы избежать потери десятичных знаков, как это произошло для col3 приведенного выше примера.

Содержание, воспроизведенное на этом сайте, является собственностью его соответствующих владельцев, и это содержание не проверяется MariaDB заранее. Мнения, информация и мнения, выраженные в этом контенте, не обязательно отражают мнения MariaDB или любой другой стороны.

© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/connect-dos-and-fix-table-types/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API