Self-initiated demo by Flow Lab, run on the open Chinook sample database (MIT, © Luis Rocha) - not client data. A report that caught a mismatch (RU)

Migration verification report

Chinook · SQLite → PostgreSQL 18.3

Checked 2026-09-25 16:51 (UTC+0800) · in 0.42 s
11Tables
15,607Rows
11/11Checksums
11/11Foreign keys
2.18 sMigration

Structure

Data by table

TableSourcePostgreSQLChecksumStatus
Album34734704418092ae4f347 → 347 · 04418092ae4fmatch
ColumnTypeNullsValue check
AlbumIdINTEGER → integer0sum 60378✓
TitleNVARCHAR(160) → varchar(160)07874 chars✓
ArtistIdINTEGER → integer0sum 42314✓
Artist275275210ce975edcb275 → 275 · 210ce975edcbmatch
ColumnTypeNullsValue check
ArtistIdINTEGER → integer0sum 37950✓
NameNVARCHAR(120) → varchar(120)05658 chars✓
Customer5959f9d7f48e9e9559 → 59 · f9d7f48e9e95match
ColumnTypeNullsValue check
CustomerIdINTEGER → integer0sum 1770✓
FirstNameNVARCHAR(40) → varchar(40)0340 chars✓
LastNameNVARCHAR(20) → varchar(20)0409 chars✓
CompanyNVARCHAR(80) → varchar(80)49166 chars✓
AddressNVARCHAR(70) → varchar(70)01055 chars✓
CityNVARCHAR(40) → varchar(40)0460 chars✓
StateNVARCHAR(40) → varchar(40)2965 chars✓
CountryNVARCHAR(40) → varchar(40)0375 chars✓
PostalCodeNVARCHAR(10) → varchar(10)4332 chars✓
PhoneNVARCHAR(24) → varchar(24)1973 chars✓
FaxNVARCHAR(24) → varchar(24)47208 chars✓
EmailNVARCHAR(60) → varchar(60)01240 chars✓
SupportRepIdINTEGER → integer0sum 233✓
Employee887a0a8d424b128 → 8 · 7a0a8d424b12match
ColumnTypeNullsValue check
EmployeeIdINTEGER → integer0sum 36✓
LastNameNVARCHAR(20) → varchar(20)050 chars✓
FirstNameNVARCHAR(20) → varchar(20)046 chars✓
TitleNVARCHAR(30) → varchar(30)0111 chars✓
ReportsToINTEGER → integer1sum 20✓
BirthDateDATETIME → timestamp01947-09-19 … 1973-08-29✓
HireDateDATETIME → timestamp02002-04-01 … 2004-03-04✓
AddressNVARCHAR(70) → varchar(70)0130 chars✓
CityNVARCHAR(40) → varchar(40)063 chars✓
StateNVARCHAR(40) → varchar(40)016 chars✓
CountryNVARCHAR(40) → varchar(40)048 chars✓
PostalCodeNVARCHAR(10) → varchar(10)056 chars✓
PhoneNVARCHAR(24) → varchar(24)0135 chars✓
FaxNVARCHAR(24) → varchar(24)0135 chars✓
EmailNVARCHAR(60) → varchar(60)0174 chars✓
Genre252566e027ddd8f225 → 25 · 66e027ddd8f2match
ColumnTypeNullsValue check
GenreIdINTEGER → integer0sum 325✓
NameNVARCHAR(120) → varchar(120)0224 chars✓
Invoice412412b690d0644c4c412 → 412 · b690d0644c4cmatch
ColumnTypeNullsValue check
InvoiceIdINTEGER → integer0sum 85078✓
CustomerIdINTEGER → integer0sum 12331✓
InvoiceDateDATETIME → timestamp02009-01-01 … 2013-12-22✓
BillingAddressNVARCHAR(70) → varchar(70)07368 chars✓
BillingCityNVARCHAR(40) → varchar(40)03211 chars✓
BillingStateNVARCHAR(40) → varchar(40)202455 chars✓
BillingCountryNVARCHAR(40) → varchar(40)02620 chars✓
BillingPostalCodeNVARCHAR(10) → varchar(10)282318 chars✓
TotalNUMERIC(10,2) → numeric(10,2)0sum 2328.60✓
InvoiceLine2,2402,240c5ccb30fb50e2,240 → 2,240 · c5ccb30fb50ematch
ColumnTypeNullsValue check
InvoiceLineIdINTEGER → integer0sum 2509920✓
InvoiceIdINTEGER → integer0sum 463386✓
TrackIdINTEGER → integer0sum 3847725✓
UnitPriceNUMERIC(10,2) → numeric(10,2)0sum 2328.60✓
QuantityINTEGER → integer0sum 2240✓
MediaType5544afcd4cd4995 → 5 · 44afcd4cd499match
ColumnTypeNullsValue check
MediaTypeIdINTEGER → integer0sum 15✓
NameNVARCHAR(120) → varchar(120)0104 chars✓
Playlist1818523d94348c2918 → 18 · 523d94348c29match
ColumnTypeNullsValue check
PlaylistIdINTEGER → integer0sum 171✓
NameNVARCHAR(120) → varchar(120)0217 chars✓
PlaylistTrack8,7158,71549878b305cd68,715 → 8,715 · 49878b305cd6match
ColumnTypeNullsValue check
PlaylistIdINTEGER → integer0sum 42852✓
TrackIdINTEGER → integer0sum 15400117✓
Track3,5033,50325bf4c35f5983,503 → 3,503 · 25bf4c35f598match
ColumnTypeNullsValue check
TrackIdINTEGER → integer0sum 6137256✓
NameNVARCHAR(200) → varchar(200)055639 chars✓
AlbumIdINTEGER → integer0sum 493676✓
MediaTypeIdINTEGER → integer0sum 4233✓
GenreIdINTEGER → integer0sum 20056✓
ComposerNVARCHAR(220) → varchar(220)97862081 chars✓
MillisecondsINTEGER → integer0sum 1378778040✓
BytesINTEGER → integer0sum 117386255350✓
UnitPriceNUMERIC(10,2) → numeric(10,2)0sum 3680.97✓

How it was checked

  1. Every row of every table was read from both databases in primary-key order.
  2. Values were normalised the same way (numbers to the column scale, timestamps to microseconds, binary to hex) and hashed into a per-table MD5 checksum. Equal checksums mean every value is equal.
  3. Per column: null count, numeric sum, text length and date range — so any mismatch is located instantly.
  4. Structure was checked too: foreign keys (validated by PostgreSQL on every row), indexes and key sequences.