カスタムデータ型などはありますか?


14

MySQLはカスタムデータ型をサポートしていますか?たとえば、郵便番号はvarchar(10)フィールドに格納されintますが、空白のオプションと5桁か5 + 4桁の郵便番号かを示すフラグを付けて、に圧縮できます。

そのようなことのためにシームレスなデータ型をインストールする方法はありますか?アプリケーションに関する限り、それは文字列型であり、アプリケーションが無効なデータを渡すと、データの切り捨て(警告の有無にかかわらず)が発生します。

カスタム関数を使用できます(たとえば、INET_ATONIPv4アドレス用の組み込み関数があります。ただし、zip LIKE '12345%'適切にインデックスを作成する必要があるものは許可されません。カスタムデータ型の適切なサポートにより、データ型をマークできます。そのため、コンパクトzip intは、並べ替えられると、まるでのように並べ替えられzip varchar(10)ます。

これにより、列の幅を固定でき、6または10バイトの変数ストレージを固定幅の4バイトに削減できます。

適用可能な用途がいくつかあります

  • 郵便番号
  • IPv6アドレス
  • 分のレベルの精度と容量を超えるカスタム2038ストレージタイムスタンプフィールドでdatetime、使用量は未満ですが、実装年より前の日付をサポートする必要はありません(システムで最も古い日付の場合、最小は2007になります)
  • DSTを実装するタイムスタンプ(存在しないようです
  • 2文字の米国の州は1バイトで保存できます
  • longはENUM、カスタムデータ型に分離DESCRIBEできるため、すべてのラッピングで出力がそれほど乱雑になりません。

データ型ハンドラーは、関数が保存される方法と同様に保存されることを期待しています。

データベースエンジンには、このようなリモートで何かがありますか?私は主にMySQLを使用しますが、これを実装したことがあるかどうか、アプリケーションに関数のような関数を呼び出させること以外は興味がありINET_ATONます。

MS SQLにはそのような性質があるように見えますが、単なる同義語以上のものかどうかを知りたいと思います。(例えばbooleanの同義語可能性がありtinyint(1)、またはpostal_codeのいずれかのcharまたはvarchar (5または9または10))シノニムは、私はおよそここに求めていたものではないです。


mysqlの簡単な答えafaik:いいえ。これは、他のRDBMSがこれらのことをどのように処理するかを見るのに興味深いでしょう
デレクダウニー

@DTest:SQL ServerにCREATE TYPEがあります:CLR型に役立ちます。msdn.microsoft.com/en-us/library/ms175007(SQL.90).aspx
gbn

1
@ジョージベイリー:SQL Serverリンクが古くなっています
。SQLServer

@gbn、(最初のコメントへの応答)が含まれるタイプの変換であり、それは例えば変換するIPv6binary(16)、又はそれは(のために使用することができたエイリアシングに限定されるstateなってS enum、S)
ブライアン・フィールド

1
国際化されたデータベースでintはzipコードを保存することはできません。たとえば、カナダでは「A9A A9A」の形式が使用されます。郵便番号用のカスタムデータ型を作成することをお勧めします。ただし、それらの一部の処理方法を再検討することをお勧めします(たとえば、1バイトのフィールドに状態を保存すると、潜在的な「その他」の問題が発生します)。また、日付/時刻データ型を再実装しないでください。提供されているデータ型が使用できないほど不足していない限り(サイズは考慮されません)、ユーザーを混乱させるだけです。
時計仕掛けのミューズ

回答:


14

MySQLはカスタムデータ型をサポートしていますか?

簡単な答え:いいえ

データベースエンジンには、このようなリモートで何かがありますか?私は主にMySQLを使用しますが、これを実装したことがあるかどうか、アプリケーションにINET_ATON関数のような関数を呼び出させること以外は興味があります。

OracleにはCREATE TYPE、メンバー関数や継承などの機能を含む、OOクラスにある程度類似したものがあります

Postgres CREATE TYPEには、オブジェクト指向クラス(メンバー関数や継承はありません)に少し劣りますが、信じられないほど柔軟で便利であり、新しい基本型を作成することもできます。また、あるCREATE DOMAIN継承またはサブタイピングの形態を可能にし、基本的にいくつかの制約を有する基本型を拡張しています。Postgresには、デフォルトでかなりの数の興味深い基本タイプがあります(例:inetおよび幾何学的タイプ)。Postgresでは、この例のようにbase36データ型のカスタムデータ型用にCで拡張機能を記述できます。

SQL ServerではCREATE TYPE、既存のシステムデータ型に基づいてカスタムデータ型を作成できます。たとえば、SSN基本的に次のように定義されている型を作成できますVARCHAR(11)が、この方法ではフィールドの大きさを覚える必要はありません。


1
最終回答を得るために、この回答を自由に編集して編集してください。質問がCWの答えに役立つと感じました...
ジャックはtopanswers.xyzを試す11

0

Firebirdには、ドメインを介したソリューションもあります

Firebirdでは、「ユーザー定義のデータ型」の概念がドメインの形式で実装されています。もちろん、ドメインを作成しても、新しいデータ型が実際に作成されるわけではありません。ドメインは、既存のデータ型を一連の属性でカプセル化し、この「カプセル」をデータベース全体で複数回使用できるようにする手段を提供します。複数のテーブルで、同一またはほぼ同一の属性で定義された列が必要な場合、ドメインは理にかなっています。

ドメインの使用は、テーブルとビューの列定義に限定されません。ドメインを使用して、PSQLコードで入力および出力パラメーターと変数を宣言できます。


FirebirdはMySQLですか?
アンソニージェノベーゼ

いいえ、FirebirdはFirebirdです:)このような機能を備えた他のRDMSとして言及しました。
ティボー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.