Есть ли такая вещь как пользовательские типы данных?

14

Есть ли в 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 ENUMs может быть разделен на пользовательский тип данных, чтобы DESCRIBEвывод не был таким беспорядочным при всей упаковке.

Я ожидаю, что обработчики типов данных будут храниться аналогично тому, как хранятся функции.

Есть ли что-нибудь подобное на любом движке базы данных? Я в основном использую MySQL, но мне любопытно, было ли это когда-либо реализовано, если бы не приложение вызывало функцию, подобную INET_ATONфункции.

MS SQL, кажется, имеет нечто подобное , но я хотел бы знать, является ли это чем-то большим, чем просто синонимом. (например, booleanможет быть синонимом tinyint(1)или postal_codeдля одного из charили varchar (5или 9или 10)) Синонимы не то, о чем я здесь спрашиваю.

Брайан Филд
источник
простой ответ afaik для mysql: нет. Было бы интересно посмотреть, как другие СУБД справляются с этими задачами
Дерек Дауни
@DTest: у вас есть CREATE TYPE в SQL Server: теперь полезно для типов CLR. msdn.microsoft.com/en-us/library/ms175007(SQL.90).aspx
ГБН
1
@George Бэйли: Ваша ссылка SQL Server устарело: это для SQL Server 2000. А для MySQL см stackoverflow.com/q/2451435/27535
ГБН
@gbn, (ответ на первый комментарий) Включен ли перевод типа, преобразует ли он, например, a IPv6в a binary(16), или он ограничен псевдонимами (которые могут использоваться для того, чтобы states становился enums)
Брайан Филд
1
Обратите внимание , что хранение почтового индекса кодов в качестве intволи не работ интернационализированных баз данных - Канада, например, использует формат «A9A A9A». Создание пользовательского типа данных для почтовых индексов, вероятно, является хорошей идеей; однако, вы можете пересмотреть, как вы планируете работать с некоторыми из них (например, сохранение состояния в однобайтовом поле может иметь потенциальные «другие» проблемы). И не повторяйте типы данных даты / времени, если только предоставленные не имеют недостатка (размер не учитывается) - вы просто запутаете людей.
Заводная муза

Ответы:

14

Есть ли в MySQL поддержка пользовательских типов данных?

Простой ответ: нет

Есть ли что-нибудь подобное на любом движке базы данных? Я в основном использую MySQL, но мне любопытно, было ли это когда-либо реализовано, если бы не приложение вызывало функцию, подобную функции INET_ATON.

Oracle имеет CREATE TYPEаналог, который в некоторой степени аналогичен классу OO, включая такие функции, как функции-члены и наследование

Postgres имеет CREATE TYPEнемного меньше классов OO (без функций-членов или наследования), но невероятно гибок и полезен, даже позволяя создавать новые базовые типы. Существует также, CREATE DOMAINкоторый допускает форму наследования или подтипирования и в основном расширяет базовый тип с некоторыми ограничениями. У Postgres также есть довольно много интересных базовых типов по умолчанию, например, inet и геометрические типы. В Postgres можно написать расширение на C для пользовательского типа данных, например, в этом примере с типом данных base36 .

В SQL Server есть CREATE TYPEвозможность создавать пользовательский тип данных на основе существующего системного типа данных. Например, я мог бы создать тип с именем, SSNкоторый в основном определен как, VARCHAR(11)но таким образом мне не нужно помнить, насколько велико это поле.

Джек Дуглас
источник
1
Пожалуйста, не стесняйтесь вносить и редактировать этот ответ, чтобы мы могли получить точную ссылку. Я чувствовал, что вопрос поддается ответу CW ...
Джек говорит попробуйте topanswers.xyz
0

У Firebird также есть решение через домены .

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

Использование домена не ограничивается определениями столбцов для таблиц и представлений. Домены можно использовать для объявления входных и выходных параметров и переменных в коде PSQL.

Тибор
источник
Это Firebird MySQL?
Энтони Дженовезе
Нет, Firebird - это Firebird :) Я только что упомянул в качестве другой RDMS, которая имеет такую ​​функцию.
Тибор