2012-03-21 7 views

Odpowiedz

2

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')] 
  • W kolumnach tekst powinowactwie, numery przekonwertowane na ciągi znaków.
  • W kolumnach koligacji liczb całkowitych, rzeczywistych i numerycznych łańcuchy zawierające liczby są konwertowane na liczby.
  • Ciągi, które nie zawierają liczb, pozostają ciągami, nawet w kolumnach numerycznych.
  • Bloby pozostają obiektami blobowymi, niezależnie od powinowactwa kolumny.
  • W kolumnach o powinowactwie BRAK, wartości są wstawiane bez zmian.
3

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

1

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.

+0

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