Подключение 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 приведенного выше примера.
© 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/