Есть ли в 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
в a binary(16)
, или он ограничен псевдонимами (которые могут использоваться для того, чтобы state
s становился enum
s)
int
воли не работ интернационализированных баз данных - Канада, например, использует формат «A9A A9A». Создание пользовательского типа данных для почтовых индексов, вероятно, является хорошей идеей; однако, вы можете пересмотреть, как вы планируете работать с некоторыми из них (например, сохранение состояния в однобайтовом поле может иметь потенциальные «другие» проблемы). И не повторяйте типы данных даты / времени, если только предоставленные не имеют недостатка (размер не учитывается) - вы просто запутаете людей.