sqliteが型がない場合、なぜ列のデータ型を宣言するのですか? declareデータ型の使用は何ですか?SQLiteはタイプレスですか?
Why android SQLite can store double value(java 8 bytes) into float column
sqliteが型がない場合、なぜ列のデータ型を宣言するのですか? declareデータ型の使用は何ですか?SQLiteはタイプレスですか?
Why android SQLite can store double value(java 8 bytes) into float column
これは、カラムの「親和性」を決定するために使用されます。
CREATE TABLE Example (
IntegerAffinity INTEGER,
RealAffinitity REAL,
NumericAffinity NUMERIC,
TextAffinity TEXT,
NoAffinity
);
)(Pythonのsqlite3
モジュールで)この表の中にいくつかの値を示します挿入:テキスト親和性カラムで
>>> db.execute("INSERT INTO Example VALUES(?, ?, ?, ?, ?)", [1234] * 5)
>>> db.execute("INSERT INTO Example VALUES(?, ?, ?, ?, ?)", ['1234'] * 5)
>>> db.execute("INSERT INTO Example VALUES(?, ?, ?, ?, ?)", [math.pi] * 5)
>>> db.execute("INSERT INTO Example VALUES(?, ?, ?, ?, ?)", [str(math.pi)] * 5)
>>> db.execute("INSERT INTO Example VALUES(?, ?, ?, ?, ?)", ['ABC'] * 5)
>>> db.execute("INSERT INTO Example VALUES(?, ?, ?, ?, ?)", [b'5678'] * 5)
>>> db.execute("INSERT INTO Example VALUES(?, ?, ?, ?, ?)", [b'\xAB\xCD\xEF'] * 5)
>>> list(db.execute("SELECT * FROM Example"))
[(1234, 1234.0, 1234, '1234', 1234),
(1234, 1234.0, 1234, '1234', '1234'),
(3.141592653589793, 3.141592653589793, 3.141592653589793, '3.14159265358979', 3.141592653589793),
(3.141592653589793, 3.141592653589793, 3.141592653589793, '3.141592653589793', '3.141592653589793'),
('ABC', 'ABC', 'ABC', 'ABC', 'ABC'),
(b'5678', b'5678', b'5678', b'5678', b'5678'),
(b'\xab\xcd\xef', b'\xab\xcd\xef', b'\xab\xcd\xef', b'\xab\xcd\xef', b'\xab\xcd\xef')]
宣言された列のデータ・タイプがヒント(http://sqlite.org/faq.html#q3)として使用される。
したがって、例えば、列がある場合INTEGER型の文字列を挿入しようとすると、SQLiteは文字列を整数に変換しようとします。できれば整数を挿入します。そうでなければ、文字列を挿入します。この機能をタイプアフィニティと呼びます。
ところで、SQLiteはタイプレスではありません。動的タイピングを使用します。つまり、挿入する値は、テーブル宣言から型を推測するのではなく、独自の型情報を保持します。 http://sqlite.org/datatype3.html
ドキュメントを確認してください。 SQLiteのデータベースおよびその他の エンジン間最大化との互換性するためにはhttp://sqlite.org/datatype3.html
、SQLiteはカラムの「型親和性」の概念をサポートしています。 その列に格納されているデータの推奨タイプは、 です。ここでの重要なアイデアは、タイプが であることです。これは必須ではありません。。どの列にも、すべてのタイプのデータを格納することができます。 選択肢を与えられた列の中には、 を使用して別のストレージクラスを使用するほうが好ましいでしょう。 列の優先する記憶域クラスを「親和性」と呼びます。
他のDBMSとの互換性を維持しようとしているようです。 するために、整数としてディスクに書き込まれていない端数部分と
...小さな浮動小数点値とREAL親和性を有する 列に格納されている:
はまた、彼らは、次の操作を行うことができるようにしたいですスペースを少なくして、値が読み出されると自動的に浮動小数点の ポイントに変換されます。
最終的に列の親和性は、宣言された列の型によって決まります。そのため、列の型を宣言するのはこのためです。
彼らはまた、[間違ったものとしてそれを正当化する](http://www.sqlite.org/datatypes.html)、そしてその後、テキストと数値型を後で追加することによって間違っていることを認めます! – Timmmm