Tworząc tabelę w SQLite3, jestem zdezorientowany, gdy mam do czynienia ze wszystkimi możliwymi typami danych, które implikują podobną zawartość, więc czy ktoś mógłby mi powiedzieć, jaka jest różnica między następującymi typami danych?
INT, INTEGER, SMALLINT, TINYINT
DEC, DECIMAL
LONGCHAR, LONGVARCHAR
DATETIME, SMALLDATETIME
Czy jest gdzieś dokumentacja, która wymienia min./maks. możliwości różnych typów danych? Na przykład, wydaje mi się, że smallint
zawiera większą wartość maksymalną niż tinyint
, ale mniejszą wartość niż liczba całkowita, ale nie mam pojęcia, jakie są te pojemności.
DATE
lubBOOLEAN
, ale nie zawracałbym sobie głowy rozróżnianiem różnych rozmiarów liczb całkowitych. Jest to szczególnie prawdziwe w przypadkuINTEGER PRIMARY KEY
, jedynego przypadku, w którym ważna jest dokładna nazwa typu.Różnica polega na cukrze syntaktycznym. Tylko kilka podciągów nazw typów ma znaczenie, jeśli chodzi o powinowactwo do typów.
Reguły określania powinowactwa są wymienione w witrynie SQLite .
Jeśli nalegasz na ścisłe pisanie, możesz zaimplementować to z
CHECK
ograniczeniami:Ale nigdy się tym nie przejmuję.
Jeśli chodzi o pojemność każdego typu:
INTEGER
jest zawsze podpisany jako 64-bitowy. Zauważ, że SQLite optymalizuje przechowywanie małych liczb całkowitych za kulisami, więc TINYINT i tak nie byłby przydatny.REAL
jest zawsze 64-bitowa (double
).TEXT
iBLOB
mają maksymalny rozmiar określony przez makro preprocesora, który domyślnie wynosi 1 000 000 000 bajtów.źródło
TYPEOF
. Tak więc próby wstawienia TEKSTU, który w przeciwnym razie zostałby przekonwertowany na klasę pamięci NUMERIC / INTEGER przez SQlite (tj. Taka konwersja jest bezstratna, jak na sqlite.org/datatype3.html#affinity ) zakończy się niepowodzeniem. Innymi słowy, to podejście jest bardziej rygorystyczne niż podejście ad-hoc polegające na wstawianiu wartości, a następnie magicznym sprawdzaniu klasy pamięci używanej do przechowywania tej wartości przez SQLite. Aby uzyskać bardziej liberalne podejście, zobacz moją odpowiedź poniżej.Większość z nich jest dostępna dla kompatybilności. Tak naprawdę masz tylko liczby całkowite, zmiennoprzecinkowe, tekstowe i obiekty blob. Daty mogą być przechowywane jako liczby (czas unix to liczba całkowita, czas Microsoft to liczba zmiennoprzecinkowa) lub tekst.
źródło
NULL
. Wartość jest wartością NULL.INTEGER
. Wartość jest liczbą całkowitą ze znakiem, przechowywaną w 1, 2, 3, 4, 6 lub 8 bajtów, w zależności od wielkości wartości.REAL
. Wartość jest wartością zmiennoprzecinkową, przechowywaną jako 8-bajtowa liczba zmiennoprzecinkowa IEEE.TEXT
. Wartość jest ciągiem tekstowym przechowywanym przy użyciu kodowania bazy danych (UTF-8, UTF-16BE lub UTF-16LE).BLOB
. Wartość to zbiór danych przechowywanych dokładnie tak, jak zostały wprowadzone.źródło
Jako dodatek do odpowiedzi z dan04, jeśli chcesz na ślepo wstawić
NUMERIC
inne niż zero reprezentowane przez a,TEXT
ale upewnij się, że tekst można zamienić na numeryczny:Typowy przypadek użycia to zapytanie z programu, który traktuje wszystkie dane jako tekst (dla jednolitości i prostoty, ponieważ SQLite już to robi). Zaletą tego jest to, że zezwala na takie konstrukcje:
co jest wygodne, jeśli używasz symboli zastępczych, ponieważ nie musisz specjalnie obsługiwać takich niezerowych pól numerycznych. Przykładem użycia
sqlite3
modułu Pythona byłoby:W powyższym przykładzie wszystkie wartości w
str_value_tuple
zostaną zapisane w postaci znaków ucieczki i cytowane jako ciągi po przekazaniu do SQlite. Ponieważ jednak nie sprawdzamy jawnie typu via,TYPEOF
a jedynie konwertowalność na typ , będzie on nadal działał zgodnie z oczekiwaniami (tj. SQLite albo zapisze go jako numeryczny, albo w przeciwnym razie zakończy się niepowodzeniem).źródło