Navicat 18 Review: Is It Worth It for PostgreSQL? Tested on 10M Rows

Most database client reviews are a tour of the feature list. I wanted to know something narrower: when you open Navicat 18 and put it in front of a real table, which of the new features do you actually find, and which of them hold up?

So I connected it to PostgreSQL with a table of 10 million rows and went through the headline features one by one. This is the list of what I saw: what worked on the first try, what was hidden, and one AI answer that needed a second look.

Navicat 18 review: the PostgreSQL elephant and Navicat on a balance scale, asking if it is worth it

What is Navicat, and who is it for?

A database holds your data, and to work with it you normally type SQL into a terminal (for PostgreSQL that is psql). A database client puts a window around that: you see the tables as a tree, write queries in an editor that warns you about mistakes, look at how a query will run, and move data between databases without writing scripts.

Navicat is one of the oldest of these clients. PremiumSoft, a company from Hong Kong, released the first version in 2002. Navicat Premium connects to many kinds of databases from one window: PostgreSQL, MySQL, MariaDB, Oracle, SQL Server, SQLite, MongoDB, Redis and Snowflake. It runs on Windows, macOS and Linux. It is commercial software, with a free Lite edition and a 14-day trial of the full version.

What a database client does: you browse tables, write SQL and read query plans, the client sits between you and databases such as PostgreSQL, MySQL, Oracle and MongoDB
A database client sits between you and your databases. Navicat is one of several.

The verdict in 30 seconds

  • Worked: the live error check, the Fix with AI preview, Explain with the real plan, Rename Symbol, and the Data Masking preview.
  • Hid: Explain sits in the Query menu, code completion stays silent until you pick a schema, and Rename Symbol is greyed out while text is selected.
  • Needs care: AI answers depend on the model you connect. The first Ask AI answer used column names that were not in my schema, so read the SQL before you run it. In my first Data Masking run, the e-mail, phone and IBAN columns came back as short numbers, so set the technique per column and read the preview.
  • Not tested: AI Fill and moving data between different database types.
  • Free Lite: keeps completion and the live error check. Refactoring, Visual Explain, Data Masking and AI error fixing are in the paid editions.

How I tested it

The database is a local PostgreSQL 17.6 server. It holds the events table with 10 million rows from my index benchmark, plus two small tables I added for this test: customers (50,000 rows of made-up names, emails, phone numbers, IBANs and card numbers) and orders (200,000 rows). Nothing in them is real.

The big table opened in the grid with the first rows, and the info panel listed its columns and types.

Navicat 18 table viewer showing the events table with 10 million rows next to the object tree
The 10-million-row events table opens in the grid with a table info panel on the right.

One detail is worth knowing. The info panel says Rows 10,000,124. The table has exactly 10,000,000 rows. The panel reads PostgreSQL’s planner statistics (pg_class.reltuples, which holds 10,000,124 here), not a count(*), and nothing marks the number as an estimate. It is a small thing, and an honest one to report.

Mistakes caught before you run the query

I typed SELECT user_idd FROM events WHERE status = 'failed', with a typo in the column name. Before I ran anything, user_idd was underlined in red. Hovering over it showed the message Identifier reference user_idd unfound in database [ln:1 col:8 len:8] with two buttons, Copy and Fix with AI.

Navicat 18 live error detection: a red underline on a misspelled column and a hover message with Copy and Fix with AI
The error is flagged before the query runs, with line, column and length.

That is the live error check from the version 18 announcement, and it works. The check is against the real schema, not just against SQL syntax. The wording is a little stiff (“unfound in database”), and it does not suggest user_id on its own, but it points at the exact spot.

The suggestion comes from the second button. Fix with AI opens a dialog with the original text on the left and the AI’s text on the right, and nothing is replaced until you accept. Gemini 2.5 Flash corrected the typo to user_id. That preview-before-write behaviour matches what Navicat promises.

Navicat 18 Fix with AI: original query on the left, AI suggested query on the right
Fix with AI shows the original and the suggestion side by side before it changes the query.

The AI needs an assistant first

There is no built-in model. Under Settings, AI the assistant list starts empty, and you add one with the plus button. The providers I saw: OpenAI ChatGPT, Google Gemini, Anthropic Claude, DeepSeek, xAI Grok, Alibaba Qwen, ByteDance Doubao, Moonshot Kimi, and then OpenAI Compatible, Ollama and LM Studio. There is also an option to compare answers from several assistants.

Navicat 18 AI settings with an empty assistant list and the menu of providers: OpenAI, Gemini, Claude, DeepSeek, Grok, Qwen, Doubao, Kimi, OpenAI Compatible, Ollama, LM Studio
AI features stay idle until you add an assistant. Ollama and LM Studio keep the data on your machine.

Two practical consequences. First, you bring your own assistant, so the AI features run on your provider’s key and terms. Second, the Attach Schema checkbox in the Fix with AI dialog was ticked, which means the table and column names go to the assistant you picked. That is a reason to try Ollama or LM Studio if your schema is sensitive.

Ask AI: read the SQL before you run it

I asked, in plain English: top 10 customers by total order amount. The suggestion came back with a preview, as before. It looked reasonable:

SELECT c.customer_id, c.customer_name, SUM(o.total_amount) AS total_order_amount
FROM customers AS c
JOIN orders AS o ON c.customer_id = o.customer_id
GROUP BY c.customer_id, c.customer_name
ORDER BY total_order_amount DESC
LIMIT 10;

It does not run as written. In my schema the columns are customers.id, customers.full_name and orders.total_cents. The three names the model chose are not in my schema, and PostgreSQL answered column c.customer_id does not exist.

Navicat 18 Ask AI dialog with a suggested SQL query for the top 10 customers by order amount
The preview looks right. The column names in it are not in my schema.

I do not claim this will happen to you. It is one answer from one model, and AI answers depend on the model you connect and on how much of your schema it sees. The dialog I saw had buttons named All Text and Server Version, and I did not find a way to attach the schema there, so the model may simply have guessed. The lesson holds either way: the preview shows the SQL, not whether it is correct. Read it, or run it on a copy, before you trust it.

Explain exists, but it is hidden

I fixed the query and looked for the plan. The Run button has a dropdown, and the dropdown holds Run, Run Current Statement and Continue on Error. No Explain. It is in the macOS menu bar under Query.

Navicat 18 Query menu in the macOS menu bar with the Explain entry
Explain sits in the Query menu, next to Ask AI.

The plan opens in a panel with Visual, JSON, Text and Statistics views and a cost threshold slider. The visual plan for SELECT user_id FROM events WHERE status = 'failed' has two nodes: Gather (269593.38) and the table scan on events (260459.98), highlighted red as the expensive part.

Navicat 18 visual explain: a Gather node and a scan on the events table with planner costs
Visual Explain highlights the costly node. These costs match PostgreSQL's own EXPLAIN.

I ran EXPLAIN in psql on the same query to check, and the numbers match:

Gather (cost=1000.00..269593.38 rows=81334 width=4)
Workers Planned: 2
-> Parallel Seq Scan on events (cost=0.00..260459.98 rows=33889 width=4)
Filter: (status = 'failed'::text)

So Navicat shows the real server plan, not an approximation. The costs are planner units, not milliseconds. With EXPLAIN ANALYZE the same query took about 205 ms and returned 84,979 rows, where the planner had expected 81,334. A sequential scan is what you should expect here: there is no index on status. In the index benchmark (run on PostgreSQL 18) a partial index on the rare failed rows answered this kind of query in about 0.125 ms.

Code completion works once a schema is selected

Navicat’s Code Insight settings had completion switched on. For a while it still suggested nothing. The reason was in the toolbar: after I reconnected, the schema selector next to the database was empty. Until I chose public, no table names were suggested and every identifier was flagged as unfound.

With public selected, typing FROM cust put customers first in the list, marked with its schema, followed by snippets, keywords and PostgreSQL functions.

Navicat 18 code completion suggesting the customers table first, then code snippets and keywords
Tables come first, with the schema shown, then snippets and keywords.

It is good once it runs. It is a silent failure until you know to check the schema selector, and a small warning there would save newcomers a few minutes.

Rename Symbol

I wrote SELECT c.full_name, o.total_cents FROM customers c JOIN orders o ON o.customer_id = c.id and tried to rename the alias c. The menu item (right-click, Refactor, Rename Symbol, shortcut Cmd+F2) was greyed out while I had text selected. With the cursor sitting inside the alias, it was enabled.

Navicat 18 Rename Symbol dialog for the alias c in a join query, with all occurrences highlighted
The dialog asks for the new name. The three uses of the alias are highlighted in the query.

I typed cust. All three uses of the alias changed, the other alias o stayed untouched, and the query still ran.

Navicat 18 after rename: the alias is now cust in all three places and the query result is shown
After the rename the query is valid and returns the same rows.

There is no separate list of changes to review in the dialog. The highlighting in the editor is the preview. For a query this size it was enough.

Data Masking: mask a copy and read the preview

Data Masking is in the context menu of a table, next to Data Generation, Data Dictionary and the import and export wizards.

Navicat 18 table context menu with Data Masking, Data Generation and Data Dictionary entries
Right-click a table to open Data Masking.

I ran it on a copy of customers: 50,000 rows with made-up names, e-mails, phone numbers, IBANs and card numbers. The first step lists every column with its type and key, so you do not mask a primary key by accident. I picked email, phone, iban and card_number.

Navicat 18 Data Masking wizard listing the columns of a copy of the customers table
The wizard shows column types and keys.

Each column gets its own technique: Substitution, Variance, Hashing, Nulling or Shuffling. For card_number I used Substitution with the Credit Card Number category, kept the first 6 and last 4 characters and masked the rest with *. The preview pane shows input and output side by side before anything is written: 0000000015485863 becomes 000000******5863. My made-up numbers start with zeros, so the kept part looks plain here.

Navicat 18 Data Masking settings for card_number with a preview that turns 0000000015485863 into 000000******5863
Substitution with the Credit Card Number category, and the preview of input and output.

My first run was less tidy. The email, phone and iban columns came back as short numbers like -5 and 44 instead of text that looks like an e-mail address or a phone number. So the technique and category matter per column, and the preview is where you catch it before you write.

Two habits I would keep: run it on a copy, and read the preview for every column. I did not test the other techniques one by one, or masking on the 10 million row table.

What the free Lite edition covers

Navicat Premium Lite is free, and Navicat says it can be used commercially, with up to five complimentary user accounts per organization. It connects to PostgreSQL, MySQL, SQL Server, Oracle, MariaDB, Snowflake, MongoDB, Redis and SQLite from one app.

Navicat’s feature matrix (checked on 30 October) says what is in which edition. For the features I tried:

Navicat Lite versus paid editions: code intelligence in Lite; refactoring, Visual Explain, Data Masking, data transfer and AI error fixing in the paid editions
Lite keeps code completion and live error checking. The rest of what I tested is in the paid editions.

If you mostly write SQL against PostgreSQL, Navicat Premium Lite gets you the editor intelligence for free. The refactoring, Visual Explain and masking sit in the paid editions, and you can try them for 14 days from the Premium download page.

Navicat is not the only way to do this. These are the clients people most often compare it with. I did not test them for this article, so this is only what each project says about itself:

Tool What it is Cost
pgAdmin The classic open-source admin tool made for PostgreSQL Free
DBeaver A client for many databases, with an open-source Community edition Free Community edition, paid editions
HeidiSQL A lightweight, open-source client, popular with MySQL and MariaDB users Free
DataGrip The database IDE from JetBrains Commercial
phpMyAdmin A browser-based tool for MySQL and MariaDB Free

If you only work with PostgreSQL and the budget is zero, pgAdmin, DBeaver Community or Navicat Lite will all do the basics. Navicat Premium is for people who want many database types in one polished window and are willing to pay for it.

What other users say

Independent reviews are few. On TrustRadius, Navicat has 4.45 out of 5 (8.9 out of 10) from 15 reviews, as of 31 October. Reviewers praise the clear interface, connecting several database types in one tool, and auto-complete. The common complaints are the price, a short trial and uneven documentation. AlternativeTo, which lists Navicat next to DBeaver, HeidiSQL and phpMyAdmin, shows about 80 likes. Treat both as small samples: some TrustRadius reviews are marked as incentivized.

The Bottom Line

Navicat 18 hands-on test: seven features, where each one lives and whether it worked or had a catch
Most features are one menu away, but several are not where you first look.

The live error check and the Fix with AI preview did what Navicat promises. Explain gives you the real plan, and Rename Symbol is useful. The weak spots are discoverability, not capability: Explain is in a menu you would not look at, Rename is greyed out for a reason you have to guess, and completion is silent until you set a schema.

The AI answer I got needed a fix, and a preview does not tell you whether the SQL is right. Treat Ask AI like any other suggestion: read it, and run it on a copy. If privacy matters, point the assistant at Ollama or LM Studio.

Who it fits. If you write SQL against PostgreSQL every day and want the editor to catch mistakes early, the free Lite edition already covers a good part of that. The paid editions make sense if you would use Rename Symbol, Visual Explain or masking regularly, or if you work across several database types, which I did not test here.

A preview shows you what will be written. It does not tell you whether it is right.

PostgreSQL Indexes: Which Type to Use (10M-Row Benchmark)

Giveaway: three Navicat licenses

Navicat is giving away three one-year licenses: Navicat Premium, Navicat BI and Navicat Monitor. Enter with your email below, and winners are drawn at random from the confirmed entries. Subscribing to my newsletter is an optional bonus checkbox and is not required to take part.

Originally published at alekseialeinikov.com