Spec-Zone.ru › MariaDB

Типы данных CONNECT

Многие типы данных не имеют или имеют слабое значение, когда применяются к обычным файлам. Вот почему CONNECT поддерживает только ограниченный набор типов данных. Однако таблицы источников ODBC, JDBC или MYSQL могут содержать типы данных, не поддерживаемые CONNECT. В этом случае CONNECT выполняет автоматическое преобразование в аналогичный поддерживаемый тип, если это возможно.

Типы данных, в настоящее время поддерживаемые CONNECT:

Имя типа Описание Используется для
TYPE_STRING Строка с нулевым окончанием char, varchar, text
TYPE_INT Целое число 4 байта int, mediumint, integer
TYPE_SHORT Целое число 2 байта smallint
TYPE_TINY Целое число 1 байта tinyint
TYPE_BIGINT Целое число 8 байт bigint, longlong
TYPE_DOUBLE Число с плавающей точкой 8 байт double, float, real
TYPE_DECIM Числовое значение decimal, numeric, number
TYPE_DATE Целое число 4 байта date, datetime, time, timestamp, year

TYPE_STRING

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

Параметр DATA_CHARSET должен использоваться для указания набора символов, используемого в источнике данных или файле. Обратите внимание, что, в отличие от обычного использования в MariaDB, когда используется многобайтовый набор символов, размер столбца представляет количество байтов, которые может содержать значение столбца, а не количество символов.

TYPE_INT

Тип INTEGER содержит целые числовые значения со знаком 4 байта (int языка C) в диапазоне от –2,147,483,648 до 2,147,483,647 для типа со знаком и от 0 до 4,294,967,295 для беззнакового типа.

TYPE_SHORT

Тип SHORT содержит целые числовые значения со знаком 2 байта (short integer языка C) в диапазоне от –32,768 до 32,767 для типа со знаком и от 0 до 65,535 для беззнакового типа.

TYPE_TINY

Тип TINY содержит целые числовые значения 1 байта (char языка C) в диапазоне от –128 до 127 для типа со знаком и от 0 до 255 для беззнакового типа. Для некоторых типов таблиц TYPE_TINY используется для представления логических значений (0 — ложь, любое другое значение — истина).

TYPE_BIGINT

Тип BIGINT содержит целые числовые значения со знаком 8 байт (long long языка C) в диапазоне от -9,223,372,036,854,775,808 до 9,223,372,036,854,775,807 для типа со знаком и от 0 до 18,446,744,073,709,551,615 для беззнакового типа.

В таблицах кодирование всех целочисленных значений зависит от типа таблицы. В таблицах, представленных текстовыми файлами, число записывается символами, а в таблицах, представленных двоичными файлами (BIN или VEC), число непосредственно хранится в двоичном представлении, соответствующем платформе.

Указание длины (или точности) соответствует длине поля таблицы, в котором хранится значение, только для текстовых файлов. Оно используется для установки длины выходного поля для всех типов таблиц.

TYPE_DOUBLE

Тип DOUBLE соответствует типу double языка C, значению с плавающей точкой двойной точности, закодированному с использованием 8 байт. Как и в случае с целыми числами, внутреннее кодирование в таблицах зависит от типа таблицы, символов для текстовых файлов и двоичного представления платформы для двоичных файлов.

Указание длины соответствует длине поля таблицы, в котором хранится значение, только для текстовых файлов. Масштаб (ранее точность) — это количество десятичных знаков, записанных в текстовые файлы. Для двоичных типов таблиц (BIN и VEC) это не применяется. Указатели длины и масштаба используются для установки длины выходного поля и количества десятичных знаков для всех типов таблиц.

TYPE_DECIM

Тип DECIMAL соответствует тому, что источники данных MariaDB или ODBC называют NUMBER, NUMERIC или DECIMAL: числовое значение с максимальным числом цифр (точностью), некоторые из которых являются десятичными цифрами (масштабом). Внутреннее кодирование в CONNECT — это текстовое представление числа. Например:

colname decimal(14,6)

Это определяет столбец colname как число с точностью 14 и масштабом 6. Предположим, он заполнен:

insert into xxx values (-2658.74);

Внутреннее представление будет строкой символов -2658.740000. Способ его хранения в таблице файлов зависит от типа таблицы. Указание поля длины соответствует длине поля таблицы, в котором хранится значение, и рассчитывается CONNECT из значений точности и масштаба. Эта длина составляет точность плюс 1, если масштаб не равен 0 (для десятичной точки) плюс 1, если этот столбец не беззнаковый (для возможного знака минус). В таблицах с фиксированным форматом число выравнивается по правому краю в поле шириной длина, для таблиц с переменным форматом, таких как CSV, поле представляет собой строку символов.

Поскольку этот тип в основном используется CONNECT для обработки числовых или десятичных полей типов таблиц ODBC, JDBC и MySQL, CONNECT не предоставляет вычислений или сравнений десятичных чисел самостоятельно. Вот почему десятичные столбцы таблиц CONNECT не могут быть индексированы.

Тип данных DATE

Внутренне значения дат/времени хранятся в CONNECT как целое число со знаком 4 байта. Значение 0 соответствует 01 января 1970 года 12:00:00 по координированному всемирному времени (UTC). Все остальные значения дат/времени представлены количеством секунд, прошедших или прошедших до полуночи (00:00:00), 1 января 1970 года, до этого значения даты/времени. Значения дат/времени до полуночи 1 января 1970 года представляются отрицательным числом секунд.

CONNECT обрабатывает даты с 13 декабря 1901, 20:45:52 по 18 января 2038, 19:14:07.

Хотя информация о дате и времени может быть представлена ​​в типах данных CHAR и INTEGER, тип данных DATE имеет особые связанные свойства. Для каждого значения DATE CONNECT может хранить всю или только часть следующей информации: век, год, месяц, день, час, минута и секунда.

Формат даты в текстовых таблицах

Внутренне значения дат/времени обрабатываются как целое число со знаком 4 байта. Но в текстовых таблицах (типы DOS, FIX, CSV, FMT и DBF) даты чаще всего хранятся в виде отформатированной строки символов (хотя они также могут храниться как числовая строка, представляющая их внутреннее значение). Поскольку существует бесконечное множество способов форматирования даты, формат для декодирования дат, а также длина поля в файле должны быть связаны со столбцами дат (кроме случаев, когда они хранятся как внутреннее числовое значение).

Обратите внимание, что этот связанный формат используется только для описания способа внутреннего хранения временного значения. Этот формат используется как для вывода для декодирования даты в запросе SELECT, так и для ввода для кодирования даты в операциях INSERT или UPDATE. Однако то, что хранится в этом значении, зависит от типа данных, используемого в определении столбца (все временные значения MariaDB могут быть указаны). При создании таблицы формат связывается со столбцом даты с использованием параметра DATE_FORMAT в определении столбца, например:

create table birthday (
  Name varchar(17),
  Bday date field_length=10 date_format='MM/DD/YYYY',
  Btime time field_length=8 date_format='hh:mm tt')
engine=CONNECT table_type=CSV;

insert into birthday values ('Charlie','2012-11-12','15:30:00');

select * from birthday;

Запрос SELECT возвращает:

Имя Bday Btime
Charlie 2012-11-12 15:30:00

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

Charlie,11/12/2012,03:30 PM

Примечание: Параметр field_length существует, потому что синтаксис MariaDB не позволяет указывать длину поля в скобках для временных типов столбцов. Если не указано, длина поля рассчитывается из формата даты (иногда как максимальное значение) или делается равной значению по умолчанию, если нет формата даты. В приведенном выше примере его можно было удалить, так как вычисленные значения являются указанными. Однако, если бы тип таблицы был DOS или FIX, эти значения могли быть скорректированы, чтобы соответствовать фактической длине поля в файле.

Строка формата CONNECT состоит из ряда элементов, которые представляют конкретную информацию и определяют ее формат. Элементы будут распознаваться в том порядке, в котором они появляются в строке формата. Элементы формата даты и времени будут заменены фактической датой и временем, как они появляются в исходной строке. Они определяются следующими группами символов:

Элемент Описание
YY Две последние цифры года (например, 1996 будет закодировано как "96").
YYYY Полный год (например, 1996 можно ввести как "96", но отобразится как “1996”).
MM Номер месяца с одной или двумя цифрами.
MMM Сокращение месяца из трех символов.
MMMM Полное название месяца.
DD День месяца с одной или двумя цифрами.
DDD Сокращение дня недели из трех символов.
DDDD Полное название дня недели.
hh Час с одной или двумя цифрами в формате 12-часовом или 24-часовом формате.
mm Минуты с одной или двумя цифрами.
ss Секунды с одной или двумя цифрами.
t Сокращение AM/PM из одного символа (например, AM вводится как "A").
tt Сокращение AM/PM из двух символов (например, AM вводится как "AM").

Примечания по использованию

  • Для соответствия исходной строке, вы можете добавить текст тела в строку формата, заключив его в одинарные или двойные кавычки, если это необходимо для избежания неоднозначности. Знаки препинания не нуждаются в кавычках.
  • Информация об часах рассматривается как 12-часовой формат, если за элементом «hh» в формате следуют элементы «t» или «tt», или как 24-часовой формат в противном случае.
  • Элементы "MM", "DD", "hh", "mm", "ss" могут быть указаны одной или двумя буквами (например, "MM" или "M"), что не влияет на входные данные, но при выводе добавляется ведущий ноль к однозначным значениям для элементов с двумя буквами[1].
  • Если формат содержит элементы DDD или DDDD, имя дня недели пропускается при вводе и игнорируется при вычислении внутреннего значения даты. При выводе генерируется и отображается правильное имя дня недели.
  • Временные значения всегда хранятся как числовые в таблицах BIN и VEC.

Обработка дат, выходящих за рамки поддерживаемых дат CONNECT

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

Обработка NULL

CONNECT обрабатывает значения NULL для источников данных, способных производить значения NULL. В настоящее время это касается в основном ODBC, JDBC, MONGO, MYSQL, XML, JSON и INI типов таблиц. Для типов INI, JSON, MONGO или XML значения NULL возвращаются, когда ключ отсутствует в разделе (INI) или когда соответствующий узел не существует в строке (XML, JSON, MONGO).

Для других таблиц файлов необходимо определить, что такое значение NULL. В числовом столбце 0 иногда может быть допустимым значением, но в некоторых других случаях оно может быть бессмысленным. То же самое касается символьных столбцов: является ли пустое поле допустимым значением или нет?

Особый случай - столбцы DATE со значением DATE_FORMAT. Любое значение, не соответствующее формату, может рассматриваться как NULL.

CONNECT оставляет решение за вами. При объявлении столбца в инструкции CREATE TABLE, если он объявлен NOT NULL, пустые или нулевые значения будут считаться допустимыми значениями. В противном случае они будут считаться значениями NULL. Во всех случаях NULL заменяются на псевдо-NULL значения: строка нулевой длины для текстовых типов или нулевое значение для числовых типов. После преобразования в псевдо-NULL значения они будут распознаваться как NULL только для столбцов, объявленных как допускающие NULL.

Например:

create table t1 (a int, b char(10)) engine=connect;
insert into t1 values (0,'zero'),(1,'one'),(2,'two'),(null,'???');
select * from t1 where a is null;

Запрос select возвращает:

a b
NULL ноль
NULL ???

Действительно, значение 0, введенное в первой строке, рассматривается как NULL для столбца, допускающего NULL. Однако, если мы выполним запрос:

select * from t1 where a = 0;

Это не вернет ни одной строки, потому что NULL не равен 0 в предложении SQL where.

Теперь давайте посмотрим, что происходит со столбцами не допускающими NULL:

create table t1 (a int not null, b char(10) not null) engine=connect;
insert into t1 values (0,'zero'),(1,'one'),(2,'two'),(null,'???');

Инструкция insert выведет предупреждение:

Уровень Код Сообщение
Предупреждение 1048 Столбец 'a' не может быть null

Он заменяется псевдо-NULL 0 в четвертой строке. Посмотрим на результат:

select * from t1 where a is null;
select * from t1 where a = 0;

Первый запрос не возвращает строк, 0 — допустимые значения и не являются NULL. Второй запрос возвращает:

a b
0 ноль
0 ???

Это показывает, что значение NULL, вставленное, было заменено допустимым значением 0.

Целочисленные числовые типы

Они поддерживаются CONNECT с версии 1.01.0010 для фиксированных числовых типов (TINY, SHORT, INTEGER и BITINT).

Преобразование типов данных

CONNECT может преобразовывать данные из одного типа в другой в большинстве случаев. Эти преобразования выполняются без предупреждения, даже когда это приводит к усечению или потере точности. Это особенно верно для таблиц типа ODBC, JDBC, MYSQL и PROXY (через MySQL), потому что исходная таблица может содержать типы данных, не поддерживаемые CONNECT. Они преобразуются в типы CONNECT, если это возможно.

При преобразовании типы MariaDB преобразуются следующим образом:

Типы MariaDB Тип CONNECT Примечание
целое число, среднее целое число TYPE_INT 4-байтовое целое число
малое целое число TYPE_SHORT 2-байтовое целое число
крошечное целое число TYPE_TINY 1-байтовое целое число
char, varchar TYPE_STRING Такая же длина
double, float, real TYPE_DOUBLE 8-байтовое число с плавающей точкой
decimal, numeric TYPE_DECIM Длина зависит от точности и масштаба
все типы, связанные с датой TYPE_DATE Формат даты может быть установлен соответствующим образом
bigint, longlong TYPE_BIGINT 8-байтовое целое число
enum, set TYPE_STRING Числовое значение недоступно
Все текстовые типы TYPE_STRING
TYPE_ERROR
В зависимости от значения системной переменной connect_type_conv.
Другие типы TYPE_ERROR Не поддерживается, преобразование не предоставлено.

В случае ENUM длина столбца — это длина самого длинного значения перечисления. Для SET длина достаточна для хранения всех значений множества, соединенных запятой.

В случае столбцов TEXT обработка зависит от значений, заданных системным переменным connect_type_conv и connect_conv_size.

Примечание: BLOB в настоящее время по умолчанию не преобразуется, пока TYPE_BIN не будет добавлен в CONNECT. Однако для столбцов blob, содержащих текст, можно указать опцию FORCE (с Connect 1.06.006), а опция SKIP также применяется к столбцам ODBC BLOB.

Типы ODBC SQL преобразуются следующим образом:

Типы SQL Тип Connect Примечание
SQL_CHAR, SQL_VARCHAR TYPE_STRING
SQL_LONGVARCHAR TYPE_STRING len = min(abs(len), connect_conv_size) Если столбец сгенерирован по обнаружению (столбцы не указаны), его длина — connect_conv_size.
SQL_NUMERIC, SQL_DECIMAL TYPE_DECIM
SQL_INTEGER TYPE_INT
SQL_SMALLINT TYPE_SHORT
SQL_TINYINT, SQL_BIT TYPE_TINY
SQL_FLOAT, SQL_REAL, SQL_DOUBLE TYPE_DOUBLE
SQL_DATETIME TYPE_DATE len = 10
SQL_INTERVAL TYPE_STRING len = 8 + ((scale) ? (scale+1) : 0)
SQL_TIMESTAMP TYPE_DATE len = 19 + ((scale) ? (scale +1) : 0)
SQL_BIGINT TYPE_BIGINT
SQL_GUID TYPE_STRING llen=36
SQL_BINARY, SQL_VARBINARY, SQL_LONG-VARBINARY TYPE_STRING len = min(abs(len), connect_conv_size) Только если значение connect_type_conv равно force. Столбец должен использовать бинарный набор символов.
Другие типы TYPE_ERROR Не поддерживается.

Типы JDBC SQL преобразуются следующим образом:

Типы JDBC Тип Connect Примечание
(N)CHAR, (N)VARCHAR TYPE_STRING
LONG(N)VARCHAR TYPE_STRING len = min(abs(len), connect_conv_size) Если столбец сгенерирован по обнаружению (столбцы не указаны), его длина — connect_conv_size
NUMERIC, DECIMAL, VARBINARY TYPE_DECIM
INTEGER TYPE_INT
SMALLINT TYPE_SHORT
TINYINT, BIT TYPE_TINY
FLOAT, REAL, DOUBLE TYPE_DOUBLE
DATE TYPE_DATE len = 10
TIME TYPE_DATE len = 8 + ((scale) ? (scale+1) : 0)
TIMESTAMP TYPE_DATE len = 19 + ((scale) ? (scale +1) : 0)
BIGINT TYPE_BIGINT
UUID (специфично для PostgreSQL) TYPE_STRING
TYPE_ERROR
len=36
Если connect_type_conv=NO
Другие типы TYPE_ERROR Не поддерживается.

Примечание: Опция SKIP для connect_type_conv также применяется к таблицам ODBC и JDBC.


  1. ↑ Здесь ввод и вывод используются для указания соответственно декодирования даты для получения её числового значения из файла данных и кодирования даты для записи её в файл таблицы. Ввод выполняется в запросах SELECT; вывод выполняется в запросах UPDATE или INSERT.
Содержимое, воспроизведенное на этом сайте, является собственностью соответствующих владельцев, и это содержимое не проверяется предварительно компанией 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-data-types/

Spec-Zone.ru

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