CASTを使用すると、新しいキャストを定義できます。キャストは、2つのデータ型間の変換処理方法を指定するものです。(適切なキャストが定義されていない場合、変換処理は失敗します)。2つのデータ型に、バイナリ互換性がある可能性があります。この場合は、関数を呼び出さなくても、"自由に"お互いのデータ型に変換することができます。対応する値は、同じ内部表現を使用している必要があります。データ型textとvarcharには、バイナリ互換性があります。デフォルトでは、キャストは明示的なキャスト要求があった場合のみ発生します。typename)、もしくは、x::typenameです。ASSIGNMENTオプションを付けると、対象データ型の列に代入する際、暗黙的にそのキャストを発生させるように設定できます。foo.f1がtext型の列であるとします。ASSIGNMENTオプションが付けられていれば、上記のSQL文が実行できます。(一般的に、この種のキャストは代入キャストと呼ばれています)。IMPLICITオプションを付けると、代入の場合だけでなく、式の中にある場合でも、全てのコンテキストで暗黙的にそのキャストを呼び出すように設定できます。以下の例を参照してください。IMPLICITオプションが付けられている場合のみ実行可能です。IMPLICITオプションが付いていない場合、以下のように明示的にキャストを記述する必要があります。text);(一般的に、この種のキャストは暗黙キャストと呼ばれています。)暗黙キャストは、多用しない方が賢明です。暗黙的キャストを使用し過ぎると、PostgreSQLがコマンドを思わぬ意味に解釈してしまう原因になります。複数の解釈が可能なため、コマンドをまったく解読できなくなってしまう可能性もあります。経験的には、2つのデータ型が同一の一般的なデータ型のカテゴリに属しており、変換によって情報が保持される場合のみ、暗黙キャストを呼び出し可能にするのが良い方法と思われます。int2型からint4型へのキャストは、暗黙キャストにするのが妥当ですが、float8型からint4型へのキャストは、代入キャストのみにすべきと思われます。text型からint4型への変換のような、カテゴリを越えるデータ型のキャストは、明示的にのみ使用するのが適切です。キャストを作成するには、変換元または変換先のデータ型を所有している必要があります。(バイナリ互換性があるキャスト変換を誤って使用するとサーバがクラッシュしてしまう可能性が高いことから、この制限が付けられました)。パラメータsourcetypeキャストする変換元のデータ型の名前です。targettypeキャストする変換先のデータ型の名前です。funcname(argtypes)この関数は、キャストを実行するために使用します。関数名は、スキーマ修飾することができます。スキーマ修飾されていない場合、関数はスキーマ検索パスから検索されます。関数の結果のデータ型は、キャストの変換先のデータ型と一致する必要があります。引数については後で説明します。FUNCTION変換元データ型と変換先データ型の間に、バイナリ互換性があることを示します。この場合、キャストを実行するのに関数は必要ありません。ASSIGNMENT代入コンテキストで、暗黙的にキャストを呼び出せることを示します。IMPLICIT任意のコンテキストで、暗黙的にキャストを呼び出せることを示します。キャストを実装する関数は1〜3個の引数を取ることができます。1番目の引数型はキャストの変換元データ型と同一でなければなりません。2番目の引数(もしあれば)は、integer型でなければなりません。変換先の型に関連付けられた型修飾子を指定します。型修飾子がない場合は-1を指定します。3番目の引数(もしあれば)は、boolean型でなければなりません。(奇妙な話ですが、SQL仕様では、明示的キャストと暗黙的キャストとの間で異なる振舞いを要求する場合があります。この引数はそのようなキャストを実装しなければならない関数用に提供されています。独自のデータ型をこの流儀に従うように設計することは勧められません)。通常、キャストにおける変換元データ型と変換先データ型は異なる必要があります。2つ以上の引数を持つ関数でキャストを実装した場合は、変換元と変換先とで同一のデータ型を持つキャストを宣言することができます。これは、システムカタログにおいて型固有の長さ強制関数を表現するために使用されています。(文法上、型修飾子を持つのは特定の組み込みデータ型のみなので、この機能は変換先のデータ型がユーザ定義のものである場合には役に立ちません。ここでは、説明を完全にするために言及しています)。変換元と変換先のデータ型が異なるキャストにおいて複数の引数を取る関数は、あるデータ型から他のデータ型への変換と長さの強制を1つの操作にまとめたものを表します。引数を1つしか取らない場合は、型修飾子を使用して型を強制するために、データ型間の変換と修飾子の適用という2つの操作が必要となります。CASTを使用してください。データ型を双方向に変更可能にするには、双方向のキャストを明示的に宣言する必要があることに注意してください。7.3より前のバージョンでは、データ型と同じ名前を持ち、そのデータ型を返し、異なるデータ型の引数を1つ取る関数は、自動的にキャスト関数とみなされていました。この慣習は、スキーマを導入し、システムカタログでバイナリ互換性によるキャストを実現可能にしたことにより、廃止されました。組み込みキャスト関数は、まだこの命名規則に従っています。他のキャスト同様、pg_castシステムカタログにキャストとして示されている必要があります。必須ではありませんが、キャストを実装する関数には変換先のデータ型の名前を付けるという以前からの慣習に従っておくことを推奨します。多くのユーザはtypename(x)という関数スタイルの記法でデータ型のキャストを行っています。この記法は、キャストを実装している関数の呼び出しに他なりません。キャストとして特別に扱っているわけではないのです。ユーザが作成した変換関数の名前がこの慣習に従っていないと、他のユーザがとまどうことになります。PostgreSQLは引数として異なる型を取る同じ名前の関数をオーバーロードすることができるので、様々な型から特定の変換先型への変換関数の名前を全て変換先の型名にしても特に問題は発生しません。先ほどの段落には少しだけ嘘があります。pg_castが、明示的な関数呼び出しの意味解決に使用される場合があることです。関数呼び出しname(x)が実際の関数に一致せず、nameがデータ型の名前であり、pg_castにxの型からその型へのキャストがバイナリ互換であることが示されていた場合、この呼び出しは明示的キャストとして処理されます。この例外は、実際の関数が存在しなくても、関数のような構文でバイナリ互換キャストを呼び出すことができるように作成されました。関数int4(text)を使用したtext型からint4型へのキャストを作成します。int4(text);(このキャストは、システムに既に定義されています。)互換性SQLではバイナリ互換性があるデータ型や実装関数の追加の引数について規定されていません。IMPLICITは、PostgreSQLの拡張です。CASTは標準SQLに準拠しています。