Есть ли в MySQL поддержка пользовательских типов данных? Например, почтовые индексы могут быть сохранены в varchar(10)
поле, но они могут быть сжаты в поле int
с параметрами для пустого поля и флагом того, является ли это 5-значным или 5 + 4-значным почтовым индексом.
Есть ли способ установить бесшовные типы данных для таких вещей? Что касается приложения, то это будет строковый тип, будет просто усечение данных (с предупреждением или без него), если приложение передаст недопустимые данные.
Могут использоваться пользовательские функции (например, есть встроенная функция INET_ATON
для адресов IPv4. Но это не позволяет делать такие вещи, zip LIKE '12345%'
которые должны быть должным образом проиндексированы. Хорошо написанная поддержка пользовательских типов данных позволит пометить тип данных как сортируемый. Таким образом, компакт zip int
, при сортировке, будет сортироваться так, как если бы он был zip varchar(10)
.
Это позволило бы столбцу быть фиксированной ширины, это позволило бы сократить объем хранения переменной 6 или 10 байтов до 4 байтов фиксированной ширины.
Есть несколько применений
- Zip коды
- IPv6-адреса
- Настраиваемые поля меток времени с точностью до минутного уровня и более высокой емкостью
2038
с меньшим использованием хранилища, чем при этомdatetime
, но нет необходимости поддерживать даты до года внедрения (скажем, мин может быть 2007, если это самые старые даты в системе) - Временные метки, которые реализуют DST (которые , кажется, не существуют )
- Двухбуквенный штат США может храниться в одном байте
- long
ENUM
s может быть разделен на пользовательский тип данных, чтобыDESCRIBE
вывод не был таким беспорядочным при всей упаковке.
Я ожидаю, что обработчики типов данных будут храниться аналогично тому, как хранятся функции.
Есть ли что-нибудь подобное на любом движке базы данных? Я в основном использую MySQL, но мне любопытно, было ли это когда-либо реализовано, если бы не приложение вызывало функцию, подобную INET_ATON
функции.
MS SQL, кажется, имеет нечто подобное , но я хотел бы знать, является ли это чем-то большим, чем просто синонимом. (например, boolean
может быть синонимом tinyint(1)
или postal_code
для одного из char
или varchar
(5
или 9
или 10)
) Синонимы не то, о чем я здесь спрашиваю.
источник
IPv6
в abinary(16)
, или он ограничен псевдонимами (которые могут использоваться для того, чтобыstate
s становилсяenum
s)int
воли не работ интернационализированных баз данных - Канада, например, использует формат «A9A A9A». Создание пользовательского типа данных для почтовых индексов, вероятно, является хорошей идеей; однако, вы можете пересмотреть, как вы планируете работать с некоторыми из них (например, сохранение состояния в однобайтовом поле может иметь потенциальные «другие» проблемы). И не повторяйте типы данных даты / времени, если только предоставленные не имеют недостатка (размер не учитывается) - вы просто запутаете людей.Ответы:
Простой ответ: нет
Oracle имеет
CREATE TYPE
аналог, который в некоторой степени аналогичен классу OO, включая такие функции, как функции-члены и наследованиеPostgres имеет
CREATE TYPE
немного меньше классов OO (без функций-членов или наследования), но невероятно гибок и полезен, даже позволяя создавать новые базовые типы. Существует также,CREATE DOMAIN
который допускает форму наследования или подтипирования и в основном расширяет базовый тип с некоторыми ограничениями. У Postgres также есть довольно много интересных базовых типов по умолчанию, например, inet и геометрические типы. В Postgres можно написать расширение на C для пользовательского типа данных, например, в этом примере с типом данных base36 .В SQL Server есть
CREATE TYPE
возможность создавать пользовательский тип данных на основе существующего системного типа данных. Например, я мог бы создать тип с именем,SSN
который в основном определен как,VARCHAR(11)
но таким образом мне не нужно помнить, насколько велико это поле.источник
У Firebird также есть решение через домены .
источник