Column Types
Every column in a table has a type, which decides what it can hold, how it sorts, how it is displayed, and which filter operators apply to it.
The types
| Type | Holds |
|---|---|
| Text | Any string |
| Number | Integers and decimals, in several widths |
| Boolean | True or false |
| Date | A calendar date, with no time |
| Date & time | A moment, stored in UTC |
| Duration | A length of time |
| JSON | A structured value |
| UUID | An identifier |
| List | Several text values in one cell |
| Categorical | One of a defined set of values |
| Attachment | Files on the row |
Numbers carry a width — Int32, Int64, Float32, Float64 and so on — shown beside the type as Number · Int32. The width decides the range a column can hold, which is why narrowing one is not always safe.
Decimal columns keep their precision and scale. A column defined as ten digits with two decimal places stays that; it is part of the type, not a display setting. Number formatting, including how many decimal places are shown, is separate and does not change what is stored.
Date & time columns carry a precision — seconds, microseconds or nanoseconds — and are stored in UTC. The display timezone is a view setting, shown as Display timezone: UTC (default).
Changing a column's type
You can cast a column to another type from the column menu. Three things can happen, and the app decides which before you commit:
| What it means | |
|---|---|
| Safe | The cast always works on well-formed data — Int32 to Int64, say |
| Lossy | It may empty rows it cannot convert, or fail outright, depending on what is actually in the column |
| Disallowed | Not offered at all |
Lossy casts are offered but flagged. Text to Number is the common one: it works for the rows that hold numbers and cannot work for the rest. Narrowing a number — Int64 down to Int32 — is lossy for the same reason: values outside the smaller range have nowhere to go.
Disallowed casts are hidden rather than refused with an error, so you never pick one. They fall into two groups: conversions with no meaning (boolean to timestamp), and ones that should go through text first rather than directly.
Two types are locked and never cast:
- Attachment, because a cast would fall through to text and silently detach every file while reporting success.
- Categorical, except to a List, which is the one conversion that preserves what the column meant.
Where types come from
When you upload a CSV or paste data, types are inferred from the values. Text is the fallback: anything that does not parse consistently as something narrower stays text, which is lossless and always castable later.
Tables read through a connection carry the types the source defines.