Skip to main content
Click the chevron on a JSON or blob cell to open its value in a popover anchored to that cell. Which viewer opens follows the column: its declared type, or the Display As choice on its header, and that choice changes rendering only, never what is stored. Whether it opens for editing follows the row and the column. A row marked for deletion opens nothing at all. A result the app cannot write back to, a generated column, and a column the driver marks immutable such as MongoDB’s _id all open read-only; Change Tracking covers which results are writable. PHP serialized values, and binary past the hex cap, are read-only for everyone.

Display as formats

Right-click a column header and pick Display As. The submenu lists the formats that fit the column type, with a checkmark on the active one. An override persists per column, scoped to the connection and table. A column with a format set copies in that format when you copy the single cell; a block of cells or a whole row always copies the stored value. Id-like binary and character columns, integer columns whose names read as timestamps, and binary columns whose first rows all read as UTF-8 pick up their format on their own. Smart value detection in Settings > Data turns that off, and a manual choice always wins over it, Raw Value included. MongoDB binary columns never offer UUID, since the driver decodes them under its own Legacy UUID Encoding setting; see MongoDB. Text decides per cell, not per column: an image or a hash sitting in a column set to Text still reads as 0x89504E…. The cell edits as hex either way.

JSON viewer

A JSON-typed column opens on the chevron; double-click or Enter edits it inline instead. A text column holding JSON needs Display As > JSON first. The popover has two modes. Text is syntax-highlighted and pretty-printed, and editable when the cell is. Tree is collapsible, with a search field, and navigation only. Both keep your key order and exact number values, integers larger than JavaScript can represent included.
JSON editor popoverJSON editor popover

JSON editor popover with Text and Tree modes

The mode you switch to becomes the default for the next value, which is the same preference as JSON Viewer > Default view in Settings. The pop-out button detaches the viewer into its own resizable window. Opening a value and seeing it pretty-printed is not an edit: the row is marked changed only once you alter the content. Save commits a compact value, key order and numbers preserved, through the change tracking queue. Text that is not valid JSON prompts first.

Filtering a tree

The search field above the tree filters keys and values as you type. The PHP serialized tree works the same way.
  • Matching ignores case and accents, so cafe finds café. Full-width and half-width differ: ABC does not find ABC.
  • A row matches on its whole value, not the shortened form shown, so a match deep inside a long string counts. A match under a collapsed parent opens its parents, and a key that matches keeps its contents and stays expandable.
  • A filter that matches nothing says so, and says separately when the document was cut at 5,000 nodes, since the rows past the cut were never searched.

PHP serialized viewer

Set Display As > PHP Serialized on a text column, then double-click or press Enter. The viewer is read-only: PHP serialized values round-trip through PHP itself. Tree mode filters the same way as the JSON tree, with type badges on the nodes (str, int, arr, obj, ser, ref) and visibility badges on object members (protected, private (ClassName)). A custom-serialized class (the C: token) is one opaque leaf, and a reference (r:/R:) shows as → #N and is not followed. Raw mode shows the original string with text selection.

Blob and hex

A blob cell renders in the grid as compact hex (0x48656C…), unless its column reads as text. Click the chevron or double-click for the popover: a classic hex dump with offset, byte columns, and ASCII, plus an editable hex field under it on an editable table. That field takes spaced or continuous hex, with or without a 0x prefix, and invalid hex disables Save. Bytes that read as an image open on the picture instead, with Hex the second segment. The image viewer covers that.

Image viewer

A cell whose content is an image opens on the drawing, with its stored form one segment away: Hex for a binary column, Source for SVG markup in a text column. The source stays editable wherever the cell is, and Save commits it through the same change tracking queue as any other edit. Detection reads the value, not the column, since the same PNG turns up in BLOB, BYTEA and VARBINARY, and SVG arrives as often in a text column as a binary one. PNG, JPEG, JPEG 2000, GIF, TIFF, BMP, ICO, WebP, HEIC, HEIF and AVIF are identified from their header; SVG from its root element, behind any byte order mark, XML declaration, comment or doctype. A PDF, a Photoshop file and a camera raw file are left as hex, since a database client that opened them as “the image in this cell” would be guessing. Display As > Raw Value on the column turns detection off.
A cell popover and the row inspector each drawing an SVG logo on a transparency checkerboard, both showing Image and Source segmentsA cell popover and the row inspector each drawing an SVG logo on a transparency checkerboard, both showing Image and Source segments

One value, drawn in the popover and again in the row inspector

Transparency draws on a checkerboard. The footer names the format and, for a raster image, the stored pixel size, which is what the file holds rather than what fits the pane. Copy Image puts the drawing on the clipboard as an image; Copy on the cell itself still copies the stored value. The pop-out button opens a resizable window, read-only there. SVG rasterizes in a separate process that reads the markup and nothing else. It reaches no network and no file: an <image href="https://…">, an @import, an external entity and a <script> all draw as nothing. A document that cannot be drawn within three seconds is abandoned and the pane says so.

Limits

A value that refuses to open in one mode still opens in another.

Row details inspector

View > Show Inspector (Cmd+Option+I), or the toolbar button at the trailing end, opens it. Each field carries its column name and type on one line, with the value on the line beneath, so the value gets the row’s full width however long the column name is. A field’s editor follows its content, with no Display As step, and the first match wins.
Row details inspectorRow details inspector

Row details inspector with per-field editors

The length test reads the stored value, so a long value pasted into a single-line field stays on one line until you save and reselect the row. The hex editor shows the first 10 KB of a blob. Past that it reads Truncated, read only and refuses edits, rather than saving back the part it could show. The text box and the JSON editor each carry a drag handle under them, with separate remembered heights that survive a relaunch. Open in Window detaches a JSON, PHP or text value into its own resizable window; on an editable row, edits there join the same pending changes as the field. An image detaches read-only. The expand button on a JSON, PHP or long text field grows it to fill the inspector’s height with the other fields still listed around it; click it again to shrink it back. Binary and image fields draw at a fixed height and carry no expand button. Every field carries a menu at its trailing edge, and right-clicking the field opens the same one. Set NULL, Set DEFAULT, Set EMPTY and SQL Functions need an editable field; Ctrl+Option+N and Ctrl+Option+D reach the first two from the keyboard. Copy Value is always there, and a read-only field keeps its text selectable. With no row selected, the inspector describes the table the tab is bound to: data, index and total size, row count, average row size, engine, collation, and creation and update dates, as far as the database reports them. A tab with no table of its own, such as a query, leaves it empty. On a Structure tab it follows the structure grid and names the selected column.

Row as JSON

Right-click a row and choose Show Row as JSON, or open the inspector and switch it to JSON. The row prints as one JSON object, keys in the result’s own column order: numbers and booleans unquoted, NULL as null, binary as hex. Like Fields beside it, it prints every column the result carries, including any hidden in the grid. A JSON column, and a text column holding a document, arrive as nested keys instead of as a string.
Row as JSONRow as JSON

A Track row as JSON, with its AlbumId key opened onto the Album row

A foreign key carries a disclosure control. Click it and the referenced row is fetched and printed underneath; a foreign key inside that row expands the same way, five levels down. A key pointing back at a row already open in the tree, and one past the fifth level, carry a warning icon that says which. A NULL foreign key has no control. Always Expand Foreign Keys, in the options menu at the trailing end of the filter field, fetches the first level on every row selected from then on. It starts off and stays off until you turn it on, every session, since each key it follows is a query. The rest of that menu is Copy Visible, which puts the printed lines on the pasteboard as they stand, Collapse All, and Expand All. Long text wraps rather than being cut. The filter field takes text, or a regular expression wrapped in slashes such as /^rental/. It matches keys and values, keeps the keys that lead to a match along with everything under a key that matches, and opens what was collapsed. Escape clears it. An invalid expression outlines the field in red and filters nothing. Editing stays on Fields. Right-click a line for Copy Value and Copy Key; a foreign key line adds Open for the referenced table, filtered to that row. Caps: a document over 100,000 characters prints as a string rather than as nested keys, the same cap the JSON tree has. A binary value shows its first 64 bytes followed by an ellipsis, the same cap the grid’s own Copy applies. For whole-row JSON, switch the result to JSON mode with the switcher at the leading edge of the status bar, or from View > Result View. It shows what the grid shows, in the same order, minus hidden columns and rows marked for deletion, which the count line reports separately. Select rows in Data mode first to narrow it, then click Copy JSON.