列の親和型は、その列に格納するデータに推奨される型です。INSERT ステートメントまたは UPDATE ステートメントで値を列に格納すると、ランタイムはその値のデータ型を指定された親和型に変換しようとします。例えば、TEXT を親和型とする列に Date 型の値(ActionScript または JavaScript の Date インスタンス)を挿入すると、Date 型の値は String 表現に変換されます。これは、データベースに格納する前にオブジェクトの toString() メソッドを呼び出した場合に相当します。値を指定された親和型に変換できない場合はエラーが発生し、処理は行われません。SELECT ステートメントを使用してデータベースから値を取得すると、格納時に別のデータ型から変換されているかどうかに関係なく、親和型に対応するクラスのインスタンスが返されます。
NULL 値を受け入れる列の場合、ActionScript または JavaScript の値 null をパラメーター値として指定し、列に NULL を格納することができます。NULL 格納クラスの値を SELECT ステートメントで取得すると、列の親和型に関係なく、常に ActionScript または JavaScript の null 値が返されます。NULL 値を受け入れる列の場合、null を許容しない Number や Boolean などの型に値をキャストする前に、その列から取得した値が null かどうか必ず確認されます。
データベースの各列には、次のいずれかの親和型が割り当てられます。
-
TEXT(または String)
-
NUMERIC
-
INTEGER(または int)
-
REAL(または Number)
-
Boolean
-
Date
-
XML
-
XMLLIST
-
Object
-
NONE
TEXT(または String)
TEXT または String 親和型の列には、記憶クラス NULL、TEXT、または BLOB を使用してすべてのデータが格納されます。数値データを TEXT 親和型の列に挿入すると、データがテキスト形式に変換されてから格納されます。
NUMERIC
NUMERIC 親和型の列には、記憶クラス NULL、REAL、または INTEGER を使用して値が格納されます。テキストデータを NUMERIC 列に挿入すると、データを格納する前に整数または実数への変換が試みられます。変換に成功した場合は、INTEGER または REAL 記憶クラスを使用して値が格納されます(例えば、値 '10.05' は REAL 記憶クラスに変換されてから格納されます)。変換できない場合は、エラーが発生します。NULL 値の変換は行われません。NUMERIC 列から取得した値は、値に適した最も具体的な数値型のインスタンスとして返されます。つまり、値が正の整数または 0 の場合、uint インスタンスが返され、負の整数の場合、int インスタンスが返されます。また、値に浮動小数点部分(非整数)がある場合、Number インスタンスが返されます。
INTEGER(または int)
INTEGER 親和型を使用する列は、NUMERIC 親和型の列と同じように動作します。相違点は、浮動小数点部分のない実数値(Number インスタンスなど)または浮動小数点部分のない実数値に変換できるテキスト値を挿入した場合に、値が整数に変換され、INTEGER 記憶クラスを使用して格納される点のみです。浮動小数点部分のある実数値を格納しようとすると、エラーが発生します。
REAL(または Number)
REAL 親和型または NUMBER 親和型の列も NUMERIC 親和型の列と同じように動作しますが、整数値が強制的に浮動小数点表現に変更される点が異なります。REAL 型の列の値は、データベースから常に Number インスタンスとして返されます。
Boolean
Boolean 親和型の列には、true または false の値が格納されます。Boolean 列は、値として ActionScript または JavaScript の Boolean インスタンスを受け入れます。コードで String 型の値が格納される際には、長さが 0 より大きいストリングの場合は true、空のストリングの場合は false と判別されます。コードで数値データが格納される際には、格納される値が 0 以外の場合は true、0 の場合は false と判別されます。SELECT ステートメントを使用して BOOLEAN 値を取得すると、その値は Boolean インスタンスとして返されます。NULL 以外の値は INTEGER 記憶クラスを使用して格納され(false の場合は 0、true の場合は 1)、データの取得時に Boolean オブジェクトに変換されます。
Date
Date 親和型の列には、日付と時刻の値が格納されます。Date 列は値として ActionScript または JavaScript の Date インスタンスを受け入れるように設計されており、Date 列に String 値を格納しようとすると、ランタイムでユリウス日付に変換されます。変換に失敗するとエラーが発生します。コードで Number、int、または uint の値を格納しようとした場合、日付の検証は行われず、有効なユリウス日付値と見なされます。SELECT ステートメントを使用して Date 値を取得すると自動的に Date インスタンスに変換されます。Date 値は REAL 記憶クラスを使用してユリウス日付値として格納されるので、ソート操作や比較操作も期待どおりに動作します。
XML または XMLList
XML または XMLList 親和型を使用する列には、XML 構造が格納されます。コードで SQLStatement パラメーターを使用して XML 列にデータを格納すると、ランタイムでは ActionScript の XML() または XMLList() 関数を使用して値の変換と検証が行われます。値を有効な XML に変換できない場合、エラーが発生します。リテラル SQL テキスト値(例:INSERT INTO (col1) VALUES ('Invalid XML (no closing tag)')を使用してデータを格納すると値の解析や検証は行われず、正しい形式と判断されます。無効な値を格納した場合、その値の取得時に空の XML オブジェクトが返されます。XML および XMLList のデータは TEXT 記憶クラスまたは NULL 記憶クラスを使用して格納されます。
Object
Object 親和型の列には、Object クラスインスタンスおよび Object サブクラスインスタンスなど(例:Array インスタンスやカスタムクラスインスタンスなど)の ActionScript または JavaScript の複合オブジェクトを格納します。Object 列のデータは AMF3 形式で直列化され、BLOB 記憶クラスを使用して格納されます。値の取得時に AMF3 形式から非直列化され、格納されていたクラスのインスタンスとして返されます。表示オブジェクトなど一部の ActionScript クラスは、元のデータ型のインスタンスとして非直列化できません。カスタムクラスインスタンスの場合、格納する前に flash.net.registerClassAlias() メソッドを使用して(または Flex でクラス宣言に [RemoteObject] メタデータを追加して)、クラスのエイリアスを登録する必要があります。また、このデータを取得する前に、クラスに対して同じエイリアスを登録する必要があります。本質的に非直列化できないクラスであるため、あるいはクラスのエイリアスが未指定または不一致であるために適切に非直列化できないデータは、格納されている元のインスタンスに対応するプロパティと値を持つ匿名オブジェクト(Object クラスインスタンス)として返されます。
NONE
NONE 親和型の列には、優先される格納クラスはありません。データを挿入する前にデータの変換は行われません。
親和型の決定
列の親和型は、CREATE TABLE 文で列に対して宣言された型によって決まります。親和型を決定する際は、次の規則が適用されます(大文字と小文字は区別されません)。
-
列のデータ型に "CHAR"、"CLOB"、"STRING"、"TEXT" のいずれかのストリングが含まれている場合は、TEXT/String 親和型になります。VARCHAR 型にはストリング "CHAR" が含まれているので、TEXT 親和型が割り当てられることに注意してください。
-
列のデータ型にストリング "BLOB" が含まれている場合、またはデータ型が指定されていない場合、NONE 親和型になります。
-
列のデータ型にストリング "XMLL" が含まれている場合は、XMLList 親和型になります。
-
列のデータ型がストリング "XML" の場合は、XML 親和型になります。
-
列のデータ型にストリング "OBJE" が含まれている場合は、Object 親和型になります。
-
列のデータ型にストリング "BOOL" が含まれている場合は、Boolean 親和型になります。
-
列のデータ型にストリング "DATE" が含まれている場合は、Date 親和型になります。
-
列のデータ型にストリング "INT" が含まれている場合は("UINT" など)、INTEGER/int 親和型が列に割り当てられます。
-
列のデータ型に "REAL"、"NUMB"、"FLOA"、"DOUB" のいずれかのストリングが含まれている場合は、REAL/Number 親和型になります。
-
上記以外の場合は、NUMERIC 親和型になります。
-
CREATE TABLE t AS SELECT... ステートメントを使用してテーブルを作成する場合は、どの列にもデータ型が指定されていないので、すべての列が NONE 親和型になります。