Чи існує таке поняття, як користувацькі типи даних?


14

Чи підтримує MySQL підтримку типових даних? Наприклад, поштові індекси можуть бути збережені в varchar(10)полі, але вони можуть бути ущільнені до int, з опціями для порожнього та прапор, чи це 5-значний або 5 + 4-значний поштовий індекс.

Чи є спосіб встановити безшовні типи даних для таких речей? Що стосується програми, то це був би тип рядка, просто було б усічення даних (з попередженням або без нього), якщо програма передасть недійсні дані.

Можуть використовуватися спеціальні функції (наприклад, є вбудована функція INET_ATONдля адрес IPv4. Але це не дозволяє таких речей, zip LIKE '12345%'які слід правильно індексувати. Добре написана підтримка користувацьких типів даних дозволила б маркувати тип даних Таким чином, компактний zip intпри сортуванні міг би сортувати так само, як якщо б це було zip varchar(10).

Це дозволило б фіксувати ширину стовпця, це дозволило б зменшити сховище змінної 6 або 10 байт на 4 бади фіксованої ширини.

Існує кілька застосувань

  • Поштові коди
  • 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: ні. Це було б цікаво подивитися, як інші RDBMS впораються з цими речами
Дерек Дауні

@DTest: у вас є CREATE TYPE на SQL Server: корисно зараз для типів CLR. msdn.microsoft.com/en-us/library/ms175007(SQL.90).aspx
gbn

1
@George Бейлі: Ваша посилання SQL Server застаріло: це для SQL Server 2000. А для MySQL см stackoverflow.com/q/2451435/27535
ГБН

@gbn (відповідь на перший коментар) Є чи тип перекладу включений, він буде конвертувати наприклад, IPv6в binary(16), або вона обмежена ступенчатости (які можуть бути використані для states стати enumїй)
Bryan поле

1
Будь ласка, майте на увазі, що зберігання поштових індексів як intзаповіту не працюватиме для інтернаціоналізованої бази даних - наприклад, Канада використовує формат "A9A A9A". Створення власного типу даних для поштових індексів, мабуть, є хорошою ідеєю; однак, можливо, ви захочете переглядати, як ви плануєте займатися деякими з них (наприклад, зберігання стану в однобайтовому полі має потенційні "інші" проблеми). І не використовуйте повторно типи даних про дату / час, якщо тільки надані не мають дефіциту (розмір не враховується) - ви просто заплутаєте людей.
Clockwork-Muse

Відповіді:


14

Чи підтримує MySQL підтримку типових даних?

Проста відповідь: ні

Чи є щось подібне віддалено на будь-якому двигуні бази даних? Я в основному використовую MySQL, але мені цікаво, якщо це колись було здійснено, окрім того, щоб зробити виклик програми такою функцією, як функція INET_ATON.

Oracle має, CREATE TYPEякий певною мірою є аналогічним класу ОО, включаючи такі функції, як функції членів та успадкування

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?
Anthony Genovese

Ні, Firebird - це Firebird :) Я щойно згадував, як південний RDMS, який має таку особливість.
Тібор
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.