SQLite Viewer
Open a .db, .sqlite or .sqlite3 file and the database is on the first screen: the tables with their row counts on the left, the rows on the right, and a query box that runs one SELECT over one table. This page carries no copy of SQLite. It reads the file format itself: the 100-byte header, the page size and the bytes a file reserves at the end of every page, the table b-trees with their interior and leaf pages, the record format, and the overflow pages a long value spills onto. That is why it can tell you what it is doing rather than hand you a grid and hope. A column declared INTEGER PRIMARY KEY shows the rowid the record leaves out. A REAL column holding a whole number reads as 12.0, because SQLite stores it as an integer to save room and turns it back into a float on the way out. A row written before ALTER TABLE added a column shows that column's default, which is what SQLite does with it. And a table kept in a shape this reader does not decode, a WITHOUT ROWID table for instance, is listed with the reason rather than half read. Nothing is uploaded, nothing is written back, and no size is refused.
tables 4
orders
- idINTEGER rowid
- customerINTEGER
- totalREAL
- placedTEXT
1 view: open_orders
opened read-only
| id | customer | total | placed |
|---|---|---|---|
| 9001 | 1 | 124.5 | 2026-09-14 |
| 9002 | 8 | 18.0 | 2026-09-14 |
| 9003 | 4 | NULL | 2026-09-15 |
| 9004 | 10 | 64.25 | 2026-09-15 |
| 9005 | 2 | 9.1 | 2026-09-16 |
| 9006 | 7 | 212.4 | 2026-09-16 |
| 9007 | 3 | 36.5 | 2026-09-16 |
| 9008 | 12 | NULL | 2026-09-17 |
| 9009 | 5 | 88.0 | 2026-09-17 |
| 9010 | 9 | 14.75 | 2026-09-17 |
| 9011 | 6 | 143.2 | 2026-09-18 |
| 9012 | 11 | 27.6 | 2026-09-18 |
| 9013 | 1 | 51.0 | 2026-09-18 |
| 9014 | 4 | 19.9 | 2026-09-19 |
| 9015 | 8 | 308.75 | 2026-09-19 |
| 9016 | 2 | 42.3 | 2026-09-19 |
| 9017 | 10 | 7.25 | 2026-09-20 |
| 9018 | 3 | 96.8 | 2026-09-20 |
| 9019 | 12 | 63.45 | 2026-09-20 |
| 9020 | 7 | 11.75 | 2026-09-21 |
20 rows on screen, 1 to 20 of 20 from orders, page 1 of 1.
- 4 tables, 64 rows, nothing written
- NULL shows as NULL, a BLOB as its byte length: 16 bytes
- UPDATE is refused here: the file is opened read-only and only SELECT runs.
Common questions
- How do I open a SQLite file here?
- Press Open file and pick it, or drop the file anywhere on the dark stage. The reading happens in this tab: nothing is uploaded, there is no account, and no size is refused. The page opens on a sample database so the job is visible before you open anything of your own: 6,144 bytes, 12 pages of 512 bytes, 4 tables and 64 rows between them, with NULLs, two BLOBs and one note of 613 characters, which is more than a 512-byte page can hold and so is stored on an overflow page the reader has to follow. Your own file is read the same way and is never written to.
- What SQL can I run against the file?
- One SELECT over one table: a column list or *, FROM one table, WHERE with terms joined by AND, ORDER BY one column with ASC or DESC, and LIMIT with OFFSET. A WHERE term compares with =, !=, <, <=, >, >=, LIKE, NOT LIKE, IS NULL or IS NOT NULL, and names may be quoted with double quotes, square brackets or backticks. Everything else is refused by name rather than quietly ignored: JOIN, a second table in the FROM list, OR, IN, BETWEEN, GROUP BY, HAVING, DISTINCT, UNION, a subquery, a function call, a column alias and a second statement after a semicolon each get their own message naming what was refused. Leave the box as SELECT * FROM a table and you are simply browsing it.
- Can this change or damage my database?
- No. There is no code here that writes: the file's bytes are read through views onto the array in memory and are never assigned into, and the file on your disk is only ever read. UPDATE, INSERT, DELETE, DROP, ALTER, CREATE, REPLACE, VACUUM, BEGIN, ATTACH, DETACH and PRAGMA are each refused by name, and load_extension is refused as well, because no SQLite extension is ever loaded and no function at all is run. The Mode cell under the stage says Read-only because read-only is the only mode this page has.
- Why does one of my tables say it is not readable?
- Because its rows are not kept in the shape this reader decodes, and saying so beats showing you a table that is half right. There are three kinds. A WITHOUT ROWID table keeps its rows in an index b-tree, whose records are laid out in a different order. A virtual table, an FTS or R-tree table for example, has no b-tree of its own at all: a module inside SQLite produces its rows when a query runs. And a table with a VIRTUAL generated column stores fewer values in each row than it declares columns, so the values and the column names would not line up. The table is still listed by name, and selecting it shows the reason. Views are listed separately as views: a view is a stored query rather than stored rows.
- How are NULL and BLOB values shown?
- NULL is shown as the word NULL in a dimmer colour, and never as an empty cell, because an empty string is a different value and has to look different. A BLOB is shown as its byte length, for example BLOB 16 bytes, and the cell's tooltip carries the first bytes as hex so you can recognise a PNG or a JPEG header. The CSV that Copy and Download produce writes a NULL as an empty field and a BLOB as blob:16 bytes: never part of the bytes, because half a blob in a spreadsheet is worse than none. Everything else is written by the RFC 4180 rules, so a value holding a comma, a quote or a line break comes back quoted.
- The row count here is lower than the count my app shows. Why?
- Most likely the database is in WAL mode and the newest rows are still in the -wal file sitting beside it. This page reads the one file you opened and never the sidecar, so when the header says WAL mode it says so in a note under the stage rather than letting you believe you are looking at everything. Close the program that owns the database, or run a checkpoint in it, then open the file again and the rows will be there.
- How large a database can it open, and how does it stay quick?
- No limit is imposed here. The file is held in the tab and its pages are read as the query needs them, so the ceiling is the memory of the machine you are sitting at rather than a number this page invented. One scan looks at up to 200,000 rows, and an ORDER BY holds up to 50,000 matching rows while it sorts them. When a scan reaches one of those it stops and says so under the stage, and the count on screen is marked as at least that many rather than presented as exact. Narrow the query with WHERE or LIMIT and the count is exact again.
- Why does a number show as 12.0 rather than 12?
- Because the column is REAL and the value is stored as a float, which is worth being able to see. SQLite saves room by writing a REAL column's whole number as an integer and converting it back to a float when it reads it, and this reader follows the same rule, so a REAL column prints 12.0 where an INTEGER column prints 12. It is what the sqlite3 shell prints too. Integers are printed in full, including 64-bit values past the range a JavaScript number can hold exactly.
- What happens if the file is encrypted or damaged?
- It is refused, with a message naming what went wrong. An encrypted file does not start with the 16 bytes SQLite writes at the front of every database, so the page says it is not a SQLite database instead of showing nonsense; nothing here decrypts anything. A damaged file is caught where the damage is: a page pointer that leaves the file, a cell pointer outside its page, a payload longer than the file, a b-tree that points back at itself and an overflow chain that does not end are each named, and the page tells you which page number is at fault rather than hanging or showing a wrong value.
- Is my file or my query remembered?
- The query and the rows-per-page setting are kept in this browser alone, so the box is as you left it when you come back, and the Start over button above the tool forgets them. The database itself is not remembered: it stays on your disk, and this page holds it only while the tab is open. If your browser blocks storage entirely, everything on the page still works and nothing is kept between visits.
Every byte comes from the SQLite file format, read in this browser: the file is opened read-only, never uploaded and never written back. Only SELECT over one table runs here, and a statement that would write, attach or load an extension is refused by name. Rows that live only in an unread -wal file, and tables in a shape this reader names as one it cannot decode, are reported rather than shown.