Jeśli sqlite jest bez nazwy, dlaczego więc deklarujemy typ danych kolumny? jaki jest pożytek z deklarowanego typu danych?SQLite jest beznadziejny?
Why android SQLite can store double value(java 8 bytes) into float column
Jeśli sqlite jest bez nazwy, dlaczego więc deklarujemy typ danych kolumny? jaki jest pożytek z deklarowanego typu danych?SQLite jest beznadziejny?
Why android SQLite can store double value(java 8 bytes) into float column
Służy do określenia "powinowactwa" kolumny.
CREATE TABLE Example (
IntegerAffinity INTEGER,
RealAffinitity REAL,
NumericAffinity NUMERIC,
TextAffinity TEXT,
NoAffinity
);
Wkładanie pewne wartości do tej tabeli (z modułem Pythona sqlite3
) daje):
>>> 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')]
Deklarowany typ danych kolumna jest używana jako wskazówka (http://sqlite.org/faq.html#q3):
Tak więc, na przykład, jeśli kolumna typu INTEGER i spróbujesz wstawić ciąg do tej kolumny, SQLite spróbuje przekonwertować ciąg na liczbę całkowitą. Jeśli to możliwe, wstawia liczbę całkowitą. Jeśli nie, wstawia ciąg. Ta funkcja nazywa się powinowactwem typu.
Nawiasem mówiąc, SQLite nie jest bez typu; wykorzystuje dynamiczne pisanie. Oznacza to, że wstawiana wartość zachowuje własne informacje o typie, zamiast wnioskowania o typ z deklaracji tabeli. http://sqlite.org/datatype3.html
Zapoznaj się z dokumentacją. http://sqlite.org/datatype3.html
W celu maksymalizacjikompatybilność między SQLite i innych silników baz danych SQLite popiera koncepcję „type” na kolumnach powinowactwa. Powinowactwo typu kolumny jest zalecanym typem dla danych przechowywanych w tej kolumnie . Ważną ideą jest to, że typ jest zalecany, , nie jest wymagany. Każda kolumna może nadal przechowywać dowolny typ danych o numerze . Po prostu niektóre kolumny, z uwagi na wybór, będą preferować używać jednej klasy pamięci względem drugiej. Preferowana klasa przechowywania dla kolumny jest nazywana jej "powinowactwem".
Wygląda na to, że starają się zachować zgodność z innymi systemami DBMS.
także chcą być w stanie wykonać następujące czynności:
... małe wartości zmiennoprzecinkowe bez komponentu frakcyjnej i przechowywane w kolumnach powinowactwa z Realem są zapisywane na dysku jako liczby całkowite w celu zajmują mniej miejsca i są automatycznie przekształcane z powrotem w ruchomy punkt , gdy wartość zostanie odczytana.
Ostatecznie powinowactwo kolumny jest określone przez zadeklarowany typ kolumny, dlatego właśnie zadeklarowano typ kolumny.
Również [usprawiedliwiają to jako błąd] (http://www.sqlite.org/datatypes.html), a następnie zasadniczo przyznają, że są w błędzie, dodając tekst i typy liczbowe później! – Timmmm