2012-03-21 9 views

risposta

2

Viene utilizzato per determinare "l'affinità" della colonna.

CREATE TABLE Example (
    IntegerAffinity INTEGER, 
    RealAffinitity  REAL, 
    NumericAffinity NUMERIC, 
    TextAffinity  TEXT, 
    NoAffinity 
); 

Inserimento di alcuni valori in questa tabella (con modulo di Python sqlite3) dà):

>>> 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')] 
  • Nelle colonne di testo-affinità, i numeri vengono convertiti in stringhe.
  • Nelle colonne di numeri interi, reali e di affinità numerica, le stringhe che contengono numeri vengono convertite in numeri.
  • Le stringhe che non contengono numeri rimangono stringhe, anche in colonne numeriche.
  • I BLOB rimangono blob, indipendentemente dall'affinità della colonna.
  • Nelle colonne con affinità NONE, i valori vengono inseriti così come sono.
3

Il tipo di dati della colonna dichiarata è usato come un suggerimento (http://sqlite.org/faq.html#q3):

Così, per esempio, se una colonna è di tipo INTEGER e si tenta di inserire una stringa in quella colonna, SQLite tenterà di convertire la stringa in un numero intero. Se possibile, inserisce invece l'intero. In caso contrario, inserisce la stringa. Questa funzione è chiamata tipo affinità.

A proposito, SQLite non è senza tipo; usa la digitazione dinamica. Ciò significa che qualsiasi valore inserito mantiene le proprie informazioni sul tipo, invece di inferire il tipo dalla dichiarazione della tabella. http://sqlite.org/datatype3.html

1

Consultare la documentazione. http://sqlite.org/datatype3.html

Per compatibilità ingrandimento tra SQLite e altri editori motori, SQLite supporta il concetto di "tipo di affinità" a colonne. L'affinità del tipo di una colonna è il tipo consigliato per i dati memorizzati in quella colonna. L'idea importante qui è che il tipo è consigliato, non richiesto. Qualsiasi colonna può ancora memorizzare qualsiasi tipo di dati . È solo che alcune colonne, a seconda della scelta, preferiranno utilizzare per utilizzare una classe di memoria rispetto a un'altra. La classe di archiviazione preferita per una colonna è chiamata "affinità".

Sembra che stiano cercando di mantenere la compatibilità con altri DBMS.

Anche loro vogliono essere in grado di effettuare le seguenti operazioni:

... piccoli valori in virgola mobile con nessun componente frazionaria e conservati in colonne con il Real affinità sono scritti su disco come interi al fine di occupa meno spazio e viene automaticamente riconvertito in punto mobile mentre il valore viene letto.

In definitiva l'affinità di una colonna è determinata dal tipo dichiarato della colonna, quindi questo è il motivo per cui si dichiara il tipo di colonna.

+0

Anche [lo giustificano come una disfunzione] (http://www.sqlite.org/datatypes.html), e quindi in fondo ammettono che si sbagliano aggiungendo testo e tipi numerici in seguito! – Timmmm