SQLite教程(七):データタイプ詳細


一、保存種類とデータタイプ:
    SQLiteは、データ値の記憶を以下のように分類する。
 

     NULL: NULL 。
     INTEGER: 。
     REAL: 。
     TEXT: , UTF-8、UTF-16BE、UTF-16LE。
     BLOB: Blob , 。
 
    SQLiteは動的データタイプを採用しているが、他の従来の関係型データベースは静的データタイプを使用している。すなわちフィールドが格納可能なデータタイプは表宣言時にすなわち決定されるので、それらの間にはデータストアにおいて大きな違いがある。SQLiteでは、記憶区分とデータタイプにも一定の違いがあり、INTEGER記憶種別など6種類の異なる長さのIntegerデータタイプが含まれていますが、これらのINTEGERデータがメモリに読み込まれると、SQLiteはすべて8バイトの符号なし整数型を占有していると見なします。したがって、SQLiteについては、テーブルステートメントにフィールドタイプが明示されていても、他のタイプのデータをフィールドに格納することができます。しかし、特に説明が必要なのは、SQLiteがこのような便利さを提供してくれているにもかかわらず、データベースプラットフォームの移植可能性を考慮すると、実際の開発においては、データタイプの記憶と声明の一致をできるだけ保証するべきである。十分な理由がある場合を除き、データベースプラットフォームの移植問題を考慮しなくても、このような特徴はSQLiteで提供されます。
   1.ブールデータの種類:
    SQLiteは専用のブールストレージタイプを提供していません。代わりに、1を記憶してtrueを表し、0はfalseを表します。
   2.日付と時刻データの種類:
    ブールタイプと同様に、SQLiteも専用の日時記憶タイプを提供していません。TEXT、REAL、INTEGERのタイプがそれぞれ異なるフォーマットでこのタイプを表しています。
 

    TEXT: "YYYY-MM-DD HH:MM:SS.SSS"
    REAL: Julian
    INTEGER: Unix , 1970-01-01 00:00:00 。
 
二、類型親縁性:
    SQLiteと他のデータベースエンジンとの間のデータタイプ互換性を最大化するために、SQLiteは「タイプ親縁性」という概念を提案している。SQLiteは、テーブルフィールドが宣言された後に、そのフィールド宣言のタイプに従って、データが挿入されると、現在のデータが親縁タイプに変換されない限り、親縁タイプを優先的に使用する「タイプ親縁性」を理解することができます。このようにSQLiteは、他のタイプを考慮してこの値を記憶することができる。SQLite現在のバージョンは以下の5つの親縁タイプをサポートしています。
縁のタイプ
説明
TEXT
数値データは挿入される前にテキスト形式に変換してからターゲットフィールドに挿入する必要があります。
NUMERIC
テキストデータが親縁性NUMERICのフィールドに挿入されると、変換動作によってデータ情報が失われ、完全に可逆されることがない場合、SQLiteはテキストデータをINTEGERまたはREALタイプのデータに変換し、変換に失敗するとSQLiteはTEXT方式でデータを格納する。NULLまたはBLOBタイプの新しいデータについては、SQLiteは、何の変換もなしに、直接NULLまたはBLOBとしてデータを格納する。追加的な説明が必要なのは、浮動小数点フォーマットの定数テキストについて、例えば「30000」のように、この値がINTEGERに変換されても、数値情報が失われない場合、SQLiteはINTEGERの記憶方式に変換される。
INTEGER
親縁タイプがINTEGERのフィールドである場合、そのルールはNUMERICに相当し、唯一の違いはCAST式を実行する時である。
REAL
そのルールは基本的にNUMERICに等しく、唯一の違いは「30000」というテキストデータをINTEGER記憶方式に変換しないことである。
NONE
変換は一切せず、データが属するデータの種類で直接保存します。  
1.フィールドの親和性を決めるルール:
    フィールドの親和性は、このフィールドが宣言時に定義されるタイプに基づいて決定され、具体的なルールは以下のリストを参照することができる。以下のリストの順序、すなわち、あるフィールドタイプが同時に2つの親和性に合致する場合、前の規則が先に作用します。
    1)タイプ文字列にINTが含まれている場合、フィールドの親縁タイプはINTEGERです。
    2)タイプ文字列に「CHAR」、「CLOB」、または「TEXT」が含まれている場合、このフィールドの親縁タイプはVRCHARのようなTEXTである。
    3)タイプ文字列に「BLOB」が含まれている場合、このフィールドの親縁タイプはNONEです。
    4)タイプ文字列に「REAL」、「FLOA」または「DOUB」が含まれている場合、このフィールドの親縁タイプはREALである。
    5)その他の場合、フィールドの親縁タイプはNUMERICです。
    2.具体例:
宣言の種類
縁のタイプ
ルールを適用
INT
INTEGER
TINNY INT
SMALLINE
MEDIUMINT
BIGINT
UNSIGNED BIG INT
INT 2
INT 8
INTEGER
1
CHARACT ER(20)
VRCHAR(255)
VERY ING CHARACT ER(255)
NCHAR(55)
NATIVE CHARACER(70)
NVRCHAR(100)
TEXT
CLOB
TEXT
2
BL OB
NONE
3
REAL
DOUBLE
DOUBLE PRECISION
FLOAT
REAL
4
NUMERIC
DECIMAL(10,5)
BOOLEAN
DATE
DATETIME
NUMERIC
5
注:SQLiteでは、タイプVRCHAR(255)の長さ情報255は、他のデータベースとのステートメントの整合性を保証するためだけに、実際的な意味はありません。
三、比較式:
    SQLite 3でサポートされている比較式には、「=」、「=」、「<=」、「>」、「>」、「=」、「=」、「<>」、「IN","NOT IN","BET WEEN","IS"and"IS NOT"。
    データの比較結果は主に操作数の記憶方式に依存します。
    1)記憶方式のNULLの値は他の記憶タイプの値より小さい。
    2)格納方式はINTEGERとREALの値がTEXTまたはBLOBタイプの値より小さい。同じINTEGERまたはREALであれば、数値ルールに基づいて比較する。
    3)記憶方式はTEXTの値がBLOBタイプの値より小さいので、同じTEXTであればテキストルール(ASCII値)に基づいて比較します。
    4)二つのBLOBタイプの数値を比較した結果、C運転時関数memcmp()の結果となります。
四、操作符:
    すべての数学演算子(+,-,/,%,<,>,&,and|)は、実行前に操作数をNUMERIC記憶タイプに変換します。変換中にデータ情報が失われる可能性があります。また、1つの動作数がNULLである場合、その結果もNULLである。数学演算子では、1つの動作数が数値タイプではないように見えると、その結果は0または0.0となります。