SQLiteチュートリアル(7):データ型の詳細

3628 ワード

一、ストレージの種類とデータ型:
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は「型親縁性(Type Affinity)」という概念を提案した.テーブルフィールドが宣言された後、SQLiteはフィールドによって宣言されたタイプに基づいて親縁タイプを選択し、データが挿入されると、親縁タイプが値として優先的に格納されます.親縁タイプが一致しないか、現在のデータを親縁タイプに変換できない限り、SQLiteは値に適した他のタイプを考慮して格納されます.SQLiteの現在のバージョンでは、次の5つの親縁タイプがサポートされています.
親のタイプ
説明
TEXT
数値型データは、挿入する前にテキスト形式に変換してからターゲットフィールドに挿入する必要があります.
NUMERIC
親がNUMERICのフィールドにテキストデータが挿入されると、変換操作によってデータ情報が失われ、完全に可逆的になることがない場合、SQLiteはそのテキストデータをINTEGERまたはREALタイプのデータに変換し、変換に失敗した場合もSQLiteはTEXT方式でデータを格納する.NULLまたはBLOBタイプの新しいデータの場合、SQLiteは変換せずにNULLまたはBLOBでデータを直接保存します.さらに、浮動小数点フォーマットの定数テキスト(3000.0など)については、数値情報を失うことなくINTEGERに変換できる場合、SQLiteはINTEGERの格納方法に変換します.
INTEGER
親縁タイプがINTEGERのフィールドの場合、そのルールはNUMERICに等しく、CAST式を実行するときに唯一の違いがあります.
REAL
そのルールは基本的にNUMERICと同等であり、唯一の違いは「3000.0」のようなテキストデータをINTEGERストレージに変換しないことである.
NONE
何の変換もせずに、そのデータが属するデータ型で直接格納します.  
1.フィールドの親類性を決定するルール:
フィールドの親縁性は、このフィールドが宣言時に定義されるタイプに基づいて決定され、具体的なルールは以下のリストを参照することができる.フィールドタイプが両方の親縁性に合致する場合、前のルールが先に機能するリストの順序に注意してください.    1). タイプ文字列にINTが含まれている場合、このフィールドの親のタイプはINTEGERです.    2). タイプ文字列に「CHAR」、「CLOB」または「TEXT」が含まれている場合、このフィールドの親縁タイプはVARCHARなどのTEXTです.    3). タイプ文字列に「BLOB」が含まれている場合、このフィールドの親のタイプはNONEです.    4). タイプ文字列に「REAL」、「FLOA」または「DOUB」が含まれている場合、このフィールドの親縁タイプはREALである.    5). 残りの場合、フィールドの親縁タイプはNUMERICです.
    2. 具体例:
宣言タイプ
親のタイプ
ルールの適用
INT INTEGER TINYINT SMALLINT MEDIUMINT BIGINT UNSIGNED BIG INT INT2 INT8
INTEGER
1
CHARACTER(20) VARCHAR(255) VARYING CHARACTER(255) NCHAR(55) NATIVE CHARACTER(70) NVARCHAR(100) TEXT CLOB
TEXT
2
BLOB
NONE
3
REAL DOUBLE DOUBLE PRECISION FLOAT
REAL
4
NUMERIC DECIMAL(10,5) BOOLEAN DATE DATETIME
NUMERIC
5
注意:SQLiteでは、タイプVARCHAR(255)の長さ情報255は、他のデータベースとの宣言の一貫性を保証するためだけに、実際の意味を持たない.
三、比較式:
SQLite 3でサポートされている比較式には、"=","=",",">=","!=","<>","IN","NOT IN","BETWEEN","IS"and"IS NOT"があります.データの比較結果は主に操作数の記憶方式に依存し、その規則は:1)である.記憶方式はNULLの値が他の記憶タイプの値より小さい.    2). 記憶方式はINTEGERとREALの値がTEXTまたはBLOBタイプの値より小さく、同じINTEGERまたはREALであれば数値ルールに基づいて比較する.    3). 記憶方式は、TEXTの値がBLOBタイプの値よりも小さく、同じTEXTであればテキストルール(ASCII値)に基づいて比較する.    4). 2つのBLOBタイプの値を比較すると、その結果はCランタイム関数memcmp()の結果となります.
四、オペレータ:
すべての数学オペレータ(+,-,*,/,%,<>,&,and|)は、変換中にデータ情報が失われる可能性がある場合でも、実行前にオペランドをNUMERICストレージタイプに変換します.また、いずれかのオペランドがNULLである場合、その結果もNULLとなる.数学オペレータでは、1つのオペランドが数値タイプに見えない場合、0または0.0の結果が得られます.