2010-03-24 15 views
45

Conosco il booleantipo di colonna, ma c'è un booleanletterale in SQLite? In altre lingue, questo potrebbe essere true o false. Ovviamente, posso usare 0 e 1, ma io tendo ad evitare i cosiddetti "numeri magici" dove possibile.Esiste un valore letterale booleano in SQLite?

Da this list, sembra che possa esistere in altre implementazioni SQL, ma non in SQLite. (Sto usando SQLite 3.6.10, per quello che vale.)

+1

Vedere anche http: // stackoverflow.it/questions/843780/store-boolean-value-in-sqlite – dat

risposta

62

Dalla sezione 1.1 Boolean Datatype dei documenti:

SQLite non hai classe di memorizzazione booleano separata. Invece, i valori booleani vengono memorizzati come numeri interi 0 (falso) e 1 (vero).

Quindi sembra che sei bloccato con 0 e 1.

+9

Sono venuto qui * dopo * leggendo quel bit esatto della documentazione, che, IMHO, è estremamente ambiguo se '0' e' 1' sono in qualche modo alias con gli identificatori 'false' e' true', rispettivamente, da SQLite SQL parser. –

+2

Purtroppo questa risposta non risponde alla domanda, che non riguarda la classe di archiviazione/* tipo di colonna * ma l'uso di 'TRUE' e' FALSE' * letterali *, che sono conformi SQL come [per il documento Postgresql ] (https://www.postgresql.org/docs/8.1/static/datatype-boolean.html). – Lloeki

+0

@Lloeki - Tristemente, hai fatto riferimento alla documentazione Postgresql per una domanda SQLite ... –

6

1,1 Tipo di dati booleano

SQLite non ha una classe di memoria booleano separata. Invece, i valori booleani vengono memorizzati come numeri interi 0 (falso) e 1 (vero).

Docs

+5

Sono venuto qui * dopo * leggendo quel bit esatto della documentazione, che, IMHO, è estremamente ambiguo se '0' e' 1' sono in qualche modo alias con gli identificatori 'false' e' true', rispettivamente, dal parser SQL di SQLite. –

+0

@ O.R.Mapper IMO false e true non esiste nel mondo di SQLite. – Andrey

+5

Sì, l'ho capito, in base alle risposte a questa domanda, ma la parte citata dei documenti non è chiara su IMO. Dice che i valori booleani sono * memorizzati * come i numeri '0' e' 1', rispettivamente - e poi indicano che quei numeri corrispondono a * false * e * true *. Cosa sono * falso * e * vero * lì? Suggerimenti in linguaggio naturale per i lettori o costanti/alias compresi dal parser SQL di SQLite? Come ho detto, è molto ambiguo il modo in cui è scritto. –

0

Non esiste alcun tipo di dati booleani. Ci sono solo 5 tipi, elencati here. Gli interi possono essere archiviati con varie larghezze su disco, il più piccolo essendo 1 byte. Tuttavia, questo è un dettaglio di implementazione:

"Ma appena valori interi sono leggere di disco e nella memoria per lavorazione, vengono convertiti nel tipo di dati più generale (8 byte firmato intero)."

Detto questo, non sorprende che non ci siano letterali booleani.

+0

Il rovescio della medaglia, SQLite supporta datetimes, nonostante non sia uno di questi cinque tipi, quindi questa risposta è inconcludente. https://www.sqlite.org/datatype3.html#datetime –

-1

Ci sono solo 5 tipi di dati supportati in SQLite3.

Dalla versione ufficiale di SQLite3 doc. "Ogni valore memorizzato in un database SQLite (o manipolati dal motore di database) ha una delle seguenti classi di memoria:

NULL. The value is a NULL value. 

INTEGER. The value is a signed integer, stored in 1, 2, 3, 4, 6, or 8 bytes depending on the magnitude of the value." 

Se avete intenzione di memorizzare 1 e 0, quindi SQLite wil utilizzare 1 byte, se conservato .. Il che non è male collegamento Doc ufficiale: - http://www.sqlite.org/datatype3.html

+0

Il rovescio della medaglia, SQLite supporta datetimes, nonostante non sia uno di questi cinque tipi, quindi questa risposta è inconcludente. sqlite.org/datatype3.html # datetime –

-2

BOOLEAN -> NUMERICO (Affinity)

colonna di affinità

SQLite supporta il concetto di affinità di tipo sulle colonne.Qualsiasi colonna può ancora archiviare qualsiasi tipo di dati, ma la classe di archiviazione preferita per una colonna viene chiamata affinità. Ogni colonna della tabella in un database SQLite3 viene assegnato uno dei seguenti affinità di tipo: Affinity Descrizione

  • TESTO questa colonna memorizza tutti i dati utilizzando le classi di archiviazione NULL, TEXT o BLOB.
  • NUMERIC Questa colonna può contenere valori utilizzando tutte e cinque le classi di memoria .
  • INTEGER Si comporta come una colonna con affinità NUMERICA con un'eccezione in un'espressione CAST.
  • REALE comporta come una colonna con affinità NUMERIC tranne che obbliga valori interi in floating rappresentazione punto
  • NESSUNO Una colonna con NESSUNO affinità non preferire una classe di memorizzazione rispetto ad un altro e nessun tentativo di dati coerce da uno stoccaggio classe in un altro.

booleano Tipo dati:

SQLite non ha una classe di memoria booleano separata. Invece, i valori booleani vengono memorizzati come numeri interi 0 (falso) e 1 (vero).

@ moiing-duck "Il rovescio della medaglia, SQLite supporta datetimes, pur non essendo uno di quei cinque tipi, in modo da questa risposta è inconcludente"

SQLite non ha un classe di archiviazione riservata per la memorizzazione di date e/o orari. Invece, data e ora Funzioni integrate di SQLite sono in grado di memorizzare date e orari come TESTO, REAL, o INTERO valori:

+0

Il rovescio della medaglia, SQLite supporta datetimes, nonostante non sia uno di questi cinque tipi, quindi questa risposta è inconcludente. sqlite.org/datatype3.html#datetime –

+3

Beh, quello era aggressivo. Dal momento che hai completamente frainteso il mio punto, chiarirò: L'OP non sta chiedendo se sqlite ha un'affinità di colonne booleane. L'OP sta chiedendo se Sqlite comprende "vero" e "falso". Il fatto che sqlite abbia incorporato funzioni per date e ore è la prova che l'attenzione sull'affinità è irrilevante per la domanda. Se chiedesse se sqlite supporti date e orari, la risposta sarebbe sì. –

-1

ho notato in SQLite per Android, posso dichiarare una colonna booleana digita senza errori e sembra funzionare correttamente. Ho anche provato a definire la colonna come "int" e ad archiviare valori booleani java. Ho scaricato il db e ho confermato che sto scrivendo "true" nella colonna. Penso che funzioni.

+0

'CREATE TABLE a (b BOOLEAN DEFAULT (TRUE));' fallisce perché non capisce 'TRUE'. –

4

La questione è esplicitamente non sul tipo colonna (ossia stoccaggio-saggio) ma l'uso di TRUE e FALSE letterali (cioè parser-saggio), che sono SQL compatibile come per the PostgreSQL keywords documentation (che avviene includere anche SQL -92, SQL: 2008 e SQL: colonne 2011 nella tabella di riferimento).

La documentazione SQLite elenca all supported keywords e questo elenco non contiene né TRUEFALSE, quindi SQLite è tristemente non conforme a tale riguardo.

È inoltre possibile verificare facilmente e vedere come la barfs parser come vuole il token di essere un nome di colonna:

$ sqlite3 :memory: 
SQLite version 3.14.0 2016-07-26 15:17:14 
sqlite> CREATE TABLE foo (booleanish INT); 
sqlite> INSERT INTO foo (booleanish) VALUES (TRUE); 
Error: no such column: TRUE 
0

SQLite non essere di tipo booleano, è necessario utilizzare intero con 0 è falso e 1 è vero

+2

La tua risposta sembra copiata da https://stackoverflow.com/a/2510670/3166697 –

Problemi correlati