データ型のサポート

ほとんどの SQL データベースとは異なり、Adobe AIR の SQL データベースエンジンでは、テーブルの列に特定の型の値を格納する必要はなく、特定の型が強制されることもありません。その代わりに、格納クラスと列親和型という 2 つの概念を使用してデータ型が管理されます。この節では、格納クラスと列親和型について説明し、様々な条件下でデータ型の違いがどのように解決されるのかを示します。

格納クラス

格納クラスは、データベースへの値の格納に使用される実際のデータ型を表します。次の格納クラスがデータベースで使用されます。

NULL
値は NULL 値です。

INTEGER
値は符号付き整数です。

REAL
値は浮動小数点数値です。

TEXT
値はテキストストリングです(256 MB に制限されます)。

BLOB
値はバイナリラージオブジェクト(BLOB)です。生のバイナリデータとも呼ばれ、256 MB に制限されます。

SQL 文に埋め込まれたリテラルとしてデータベースに渡される値、またはパラメーターを使用して SQL 文にバインドされた値はすべて、SQL 文が実行される前に格納クラスに割り当てられます。

SQL 文に含まれるリテラルは、一重引用符または二重引用符で囲まれている場合は格納クラス TEXT に、引用符で囲まれておらず、小数点または指数のない数字として指定されている場合は INTEGER に、引用符で囲まれておらず、小数点または指数の付いた数字として指定されている場合は REAL に、値が NULL の場合は NULL に、それぞれ割り当てられます。リテラルを BLOB に割り当てるには、X'ABCD' 表記を使用します。詳しくは、「式」の「リテラル値」を参照してください。

SQLStatement.parameters 結合配列を使用してパラメーターとして提供された値は、バインドされたネイティブのデータ型に最も近い格納クラスに割り当てられます。例えば、int 値は INTEGER 格納クラスに、Number 値は REAL 格納クラスに、String 値は TEXT 格納クラスに、ByteArray オブジェクトは BLOB 格納クラスに、それぞれ割り当てられます。

列親和型

列の親和型は、その列に格納するデータに推奨される型です。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 親和型になります。

データ型と比較演算子

比較操作では、二項比較演算子の =、<、<=、>= および != がサポートされています。また、複数の値のいずれかに一致するかどうかをチェックする IN 演算子と、三項比較演算子の BETWEEN も使用できます。これらの演算子について詳しくは、「演算子」を参照してください。

比較の結果は、比較する 2 つの値の格納クラスによって異なります。2 つの値を比較するときは、次の規則が適用されます。

  • 格納クラス NULL の値は、他のどの値(格納クラス NULL の別の値も含む)よりも小さいと見なされます。

  • INTEGER 値または REAL 値は、どの TEXT 値または BLOB 値よりも小さいと見なされます。INTEGER または REAL を別の INTEGER または REAL と比較したときは、数値による比較が行われます。

  • TEXT 値は BLOB 値より小さいと見なされます。2 つの TEXT 値を比較するときは、二項比較が行われます。

  • 2 つの BLOB 値を比較した結果は、常に二項比較を使用して決定されます。

三項演算子 BETWEEN は常に、同等の二項表現として再構成されます。例えば、a BETWEEN b AND c は a >= b AND a <= c に再構成されます。この処理は、この式を評価するために必要なそれぞれの比較において a に異なる親和型が適用される場合でも変わりません。

a IN (SELECT b ....) という形式の式も、上記の二項比較に関する 3 つの規則に従って(つまり、a = b と同じように)処理されます。例えば、b が列の値で a が式の場合は、比較が行われる前に、b の親和型が a に適用されます。式 a IN (x, y, z) は a = +x OR a = +y OR a = +z として再構成されます。IN 演算子の右の値(この例では x、y および z の値)は、たとえそれが列の値であっても、式と見なされます。IN 演算子の左の値が列の場合は、その列の親和型が使用されます。左の値が式の場合は、変換は行われません。

また、COLLATE 句を使用して比較方法を変更することもできます。詳しくは、「COLLATE」を参照してください。

データ型と数値演算子

サポートされている数値演算子(*、/、%、+ および -)のいずれを使用するときも、式を評価する前に演算子の各オペランドに数値親和型が適用されます。どのオペランドも NUMERIC 記憶クラスに変換できない場合、その式は NULL に評価されます。

連結演算子 || を使用するときは、式が評価される前に各オペランドが TEXT 格納クラスに変換されます。どのオペランドも TEXT 記憶クラスに変換できない場合、その式の結果は NULL になります。このように、値を変換できない状況は次の 2 つの場合に起こります。1 つはオペランドの値が NULL の場合、もう 1 つはオペランドの値が TEXT 以外の記憶クラスを含む BLOB である場合です。

データ型とソート

ORDER BY 句によって値をソートしたときの並び順は、最初が記憶クラス NULL の値、次が数字順に INTEGER 値と REAL 値、その次がバイナリ順または指定された照合順序(BINARY または NOCASE)に基づく TEXT 値、最後がバイナリ順の BLOB 値です。ソートの前に格納クラスの変換は行われません。

データ型とグループ化

GROUP BY 句を使用して値をグループ化するとき、記憶クラスの異なる値は別のものと見なされます。ただし、INTEGER 値と REAL 値は、数値的に等しい場合には同じと見なされます。GROUP BY 句の結果として、値に親和型が適用されることはありません。

データ型と複合 SELECT 文

複合 SELECT 演算子の UNION、INTERSECT および EXCEPT は、値どうしを暗黙的に比較します。これらの比較が行われる前に、それぞれの値に親和型が適用される場合があります。可能であれば、複合 SELECT 文の結果セットの 1 つの列で返されるすべての値に同じ親和型が適用されます。適用される親和型は、その位置に(他の種類の式ではなく)列値を持つ最初の構成 SELECT 文によって返される列の親和型です。特定の複合 SELECT 列について、どの構成 SELECT ステートメントも列値を返さない場合、その列では親和型を適用せずに値の比較が行われます。