SQLite to CSV Converter
Drop a .sqlite, .sqlite3 or .db file and read the tables inside it. Every table with rows is listed, one converts straight away, and the whole thing runs in your browser. No client to install, no signup.
Want to join tables or filter before exporting? Open the app
The .db files people actually get handed
SQLite is the database you end up holding without asking for it. It ships inside phones, desktop apps, browsers and half the tools on a developer laptop, so a support ticket or a data request often arrives as one file with a name nobody recognises.
- An app backup. A note taking, habit tracking or journalling app exports its state as a .db, and the user wants their own data in a spreadsheet rather than locked behind the app that wrote it.
- A development database. Django, Rails, Laravel and a hundred prototypes default to SQLite. Somebody zips db.sqlite3 into a bug report and expects you to look at the rows.
- A scraper or a script's local store. Small pipelines write into SQLite because it needs no server. Getting a table out for a colleague should not require writing another script.
- A device or telemetry dump. Firmware, test rigs and mobile apps all sync out .db snapshots that somebody has to read once and never again.
- An export you were given instead of the export you asked for. This happens constantly, and installing a database client to answer one question is a poor use of an afternoon.
Worked example: a two table database
A file called field-notes.db. It holds two tables with rows in them, one view, one table that was created and never used, and an index:
CREATE TABLE sessions (id INTEGER, started_at TEXT, minutes REAL, notes TEXT);
CREATE TABLE attachments (id INTEGER, session_id INTEGER, thumb BLOB);
CREATE TABLE empty_log (id INTEGER, line TEXT);
CREATE VIEW recent_sessions AS SELECT id, started_at FROM sessions;
CREATE INDEX idx_sessions_started ON sessions(started_at);
Drop it in and the conversion has already run before you have decided anything. This is what comes back:
2 rows · from "attachments"
id,session_id,thumb
1,1,iVBORw0KGgo=
2,2,
attachments, not sessions. The list is alphabetical rather than in creation order, and the first name in it converts by default. Above the table sits a dropdown holding both names, attachments and sessions. It is the same control the Excel pages use for worksheets, so it carries the label Sheet; the names inside it are your tables. Choosing sessions reconverts immediately:
2 rows · from "sessions"
id,started_at,minutes,notes
1,2026-01-14T09:02:11Z,42.5,first run
2,2026-01-14T18:40:03Z,7,
Three things in those two outputs are worth naming. The view is not in the dropdown at all, and neither is empty_log, because a table with no rows is dropped before the list is built. The 8 byte blob in attachments came back as base64. And the REAL value stored as 7.0 prints as 7, since SQLite kept a number and CSV writes the number it was given.
The downloads are named field-notes-attachments.csv and field-notes-sessions.csv. That only happens when the database has more than one table to offer; a single table database keeps the file's own name, so vault.sqlite comes back as vault.csv.
What happens after you drop the file
There is no server in this. SQLite itself is compiled to WebAssembly, about a megabyte of it, and that build is fetched from this site the first time a database lands in the box. Your file is read into memory as bytes and opened as a database by the same engine that would have opened it on your machine, which is why the results match what a desktop client would show.
From there the steps are ordinary SQL. The catalogue is queried for table names, skipping the internal sqlite_ ones. Every table is then read with a plain select in one pass, which is what lets the picker list them, and any table that comes back with nothing is left out. The first name alphabetically becomes the CSV, the rest wait in the dropdown, and choosing one of them runs the same conversion again on the file you already dropped.
Ask for a table that turned out to be empty, by choosing a name that no longer has rows behind it, and instead of an error you get the first table again with a line explaining that the one you picked has no rows. A picker cannot fix an empty table, so refusing to show anything would just be rude.
Binary columns, and other things worth checking
- BLOBs become base64, up to a point. Under 1 MB the bytes are encoded into the cell. Over it, the cell reads <BLOB 1200000 bytes> or whatever the size happens to be, which keeps a table of stored photos from turning into a CSV nobody can open. Either way the row is still there with its other columns intact.
- Nulls and empty strings look the same. Both arrive as an empty cell, which is CSV behaving as CSV. In a database where a null answer and a blank answer mean different things, note the columns that matter before you send the file on.
- SQLite already converted some of your values. Column affinity happens at insert time, not on the way out. Text that looks like a number, put into a NUMERIC column, was stored as a number long before this page saw it, so 1e3 in the file reads as 1000. A TEXT column keeps 007 as 007.
- Only one file goes in. A database in write ahead logging mode keeps recent changes in a sidecar .db-wal file, and there is nowhere to attach one here. Check point or close the database properly before exporting if the last few writes matter.
- The name has to end in .sqlite, .sqlite3 or .db. Anything else is turned away unless the browser reports it as a generic binary file. Plenty of apps ship databases with no extension at all or their own invention, and renaming a copy is enough.
- Not every .db file is SQLite. A file that does not start with the SQLite header comes back saying it is not a database, which is also what a half finished download or an encrypted SQLCipher database looks like from the outside.
- The preview shows the first 20 rows. The count beside it is the real total, and the download holds all of them.
Frequently Asked Questions
What happens to BLOB columns?
A BLOB up to 1 MB is written into the cell as base64 text, so an eight byte PNG header becomes iVBORw0KGgo= and the bytes survive a round trip. Anything larger is replaced by a placeholder that names the size, such as BLOB 1200000 bytes, because base64 adds a third again to a value that was already too big for a spreadsheet cell. A NULL blob is an empty cell either way.
Are views included as well as tables?
No, only real tables. The dropdown is built from the database catalogue filtered to tables, so a view is invisible here even though the rows it would return are usually reachable through the tables underneath it. Internal sqlite_ tables are hidden too, and a table with no rows in it is left out of the list rather than offered as an empty download.
Is my database uploaded anywhere?
No. The file is read in your tab by SQLite compiled to WebAssembly, which is about a megabyte of code served from this site and fetched the first time you drop a database. Your .db never leaves the machine, and app databases are exactly the kind of file where that matters, since they tend to hold every message, note or session someone ever created.
How large a database can it open?
The page stops at 100 MB and offers the full editor for anything bigger. The practical limit is lower than that, because the whole database is held in memory and every table is read out of it in one pass, not just the one you end up downloading. A 100 MB database of small text rows is fine on a laptop; a 90 MB one that is mostly stored images will be slower and heavier than the size suggests.
Can I export all the tables at once?
One at a time. Pick another name from the dropdown and it converts immediately, then download that one too. The filenames keep them apart on their own: a database called field-notes.db gives field-notes-sessions.csv and field-notes-attachments.csv, so nothing lands on top of anything else in your downloads folder. A single table database keeps the plain name instead.
Does converting change my database file?
No. The bytes are copied into memory, opened read only in practice because nothing here issues a write, and thrown away when you leave the page. The file on disk is untouched, which is more than can be said for opening a live database in some desktop clients while an app still has it open.
Related
Open your SQLite database
Drop the .db or .sqlite file, pick the table you want, then copy or download the CSV. Nothing uploads and the database is never written to.
Back to the converter