Типы данных 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.
© 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/