SQL Identifier Portability Checker

Paste a proposed table or column name — or a list of them, one per line — and see exactly which of PostgreSQL, MySQL, SQL Server and SQLite would reject it, silently rename it, or otherwise treat it inconsistently, and why.

Processed locally in your browser. Your file is never uploaded.

How to use this calculator

  1. Paste one identifier per line — a table name, column name, or a batch of several. Nothing leaves your browser.
  2. Select "Check identifiers".
  3. Review each flagged name: which specific engines are affected and which aren't, and why.
  4. Use the suggested rewrite where one is offered — reserved-word collisions and quoting-style choices are left for you to decide, since both require a judgment call this tool shouldn't make unilaterally.

Assumptions

Methodology

Each identifier is checked against six specific, documented portability pitfalls: reserved-word collision (checked per engine, since a word can be reserved in one engine and not another), case-folding divergence (PostgreSQL lowercases unquoted identifiers, MySQL's case-sensitivity depends on OS/settings, SQL Server is case-insensitive-but-preserving, SQLite is case-sensitive), quoting-syntax differences (double quotes vs backticks vs square brackets), identifier length limits (63 bytes for PostgreSQL with silent truncation, 64 characters for MySQL, 128 for SQL Server, no practical limit for SQLite), invalid unquoted characters, and the leading-underscore naming convention. A rewrite is offered only for the two mechanically unambiguous cases — lowercasing for case-folding, underscore-substitution for invalid characters — never for a reserved-word rename or a quote-style choice.

Worked example

A word reserved in some engines but not all

Inputs: limit

Result: "limit" is a reserved word in PostgreSQL, MySQL and SQLite, but SQL Server has no LIMIT clause at all (it uses TOP / OFFSET-FETCH instead), so "limit" isn't reserved there. Flagged as an error naming exactly which three engines are affected.

A mixed-case identifier

Inputs: CustomerOrder

Result: PostgreSQL would silently fold this to "customerorder" if left unquoted, while MySQL, SQL Server and SQLite each have their own inconsistent case-handling rules. Flagged as a warning; rewritten to "customerorder" as the safe portable convention.

Spaces and a hyphen

Inputs: customer order-id

Result: Not a valid bare identifier in any of the four engines — each would need it quoted with a different quote character. Flagged as an error; rewritten to "customer_order_id" using underscores, the universally safe convention.

Practical guidance
Common mistakes

FAQs

Why is "limit" flagged for three engines but not SQL Server?

SQL Server doesn't have a LIMIT clause — it uses TOP or OFFSET/FETCH instead — so LIMIT was never reserved as a keyword there. It's reserved in PostgreSQL, MySQL and SQLite because all three use LIMIT in their query syntax.

Will quoting a reserved word always fix it?

In practice, yes, in all four engines here — but the quote character differs per engine (double quotes for PostgreSQL/SQLite, backticks for MySQL, square brackets for SQL Server), so a quoted name copied as-is from one engine's SQL won't parse in another's. This tool lists each engine's equivalent quoted form rather than picking one for you.

Is a leading underscore actually a problem?

No — it's flagged only as a minor, informational note. It isn't invalid in any of the four engines; it's worth knowing about only because PostgreSQL's own internal catalog objects and some ORMs use leading-underscore names by convention.