The difference that compiles and returns another value.
Every Oracle-to-PostgreSQL difference is either loud or silent, and they cost
three orders of magnitude apart. Loud means the statement will not compile
— NVL, DECODE, ROWNUM,
MINUS, TRUNC on a date — and you find it on the first
afternoon, from a stack trace, an hour each. Silent means it compiles, runs,
and returns a different value, and you find it from a customer, in a quarter,
in a reconciliation that will not balance. 7 of the 13 differences this
page checks are silent.
The engine is free and needs no account, and it reads no database:
every figure is arithmetic on the sheet you paste.
Oracle has no empty string — '' IS NULL
— so a || b ignores it, = '' never matches a
row, and a NOT NULL VARCHAR2 enforced non-emptiness for free. PostgreSQL
keeps them apart and all three stop being true: for a chain of 3 column operands,
19 of the 27 combinations return a different value, which is
3ⁿ − 2ⁿ.
VARCHAR2(40) counts BYTES and varchar(40) counts
CHARACTERS — 40 characters of ASCII, 13 of Chinese, 10 of emoji
against 40 of any of them, up to 160 bytes, 4× the old
limit — and nothing errors, because a limit getting looser is not an
error. The target type decides the arithmetic:
NUMBER(10) → integer makes 10 / 4 return
2 where Oracle returned 2.5, a
NUMBER → double precision is exact to 9,007,199,254,740,992 and then starts
skipping, and a DATE → date sets every timestamp to midnight.
And Oracle’s default sort is binary, so
Apricot, Banana, Zebra… becomes Ångström, apple, Apricot… under a locale collation
— first difference at position 1, inside a page of 10, so a paginated
query returns different rows. Every lane ships a worked example that costs nothing.
Writing the report needs credits.
1. Pick a lane
They run over one migration sheet — which two dialects, the collation and the
length semantics, then one column per line with its Oracle type, its nullability, the
PostgreSQL type someone already chose and some real sample values, then the SQL your
code runs against those columns — and each hands its result to the next.
Start at plan if you have a table and not yet a sheet, or at read if a migration tool
has already produced a schema and you want to know what it quietly changed.
Every difference, sorted by whether it announces itself
The arithmeticWorks out the sheet as you type. No account, no credits.