Van MySQL naar PostgreSQL -- PG herkent '' niet als lege string
De applicatie leeft in de ontwikkelomgeving heeft nu 50 tabellen met honderden kolommen. Geen views, triggers etc.
De gekozen strategie is om een (SQL) script te schrijven dat de inhoud kan migreren van MySQL naar PostgreSQL,
zodat het via de T- en A-omgeving naar productie kan.
Het eerste script maakt de tabellen aan in PostgreSQL, zonder constraints, zodat de data in alfabetische volgorde ingelezen kan worden, op de manier van mysqldump.
Hiervoor heb ik een paar zinnige hints gekregen in dit topic: http://www.phphulp.nl/php/forum/topic/postgres-vs-mysql/89237
Nu ben ik bij het data-deel beland. De eerste stap is om de data zo compleet mogelijk aan te leveren via:
Code (php)
1
2
3
2
3
mysqldump -u root -p --skip-quote-names --hex-blob --skip-triggers --compact
--no-create-info --complete-insert --quote-names --compatible=ansi databasenaam >
dump.sql
--no-create-info --complete-insert --quote-names --compatible=ansi databasenaam >
dump.sql
Om vervolgens de hexadecimale kolommen aan te passen:
Vervolgens wil ik de data inladen. Ik test dit met pgAdmin3, en heb vooraf de volgende compatibiliteitsinstellingen moeten maken:
Code (php)
1
2
3
4
2
3
4
SET search_path = "$user",databasenaam; -- mysqldump voegt geen schemanaam toe
SET standard_conforming_strings = OFF; -- mysqldump biedt alleen escaped strings aan
SET backslash_quote = ON;
SET escape_string_warning = OFF; -- minder logging
SET standard_conforming_strings = OFF; -- mysqldump biedt alleen escaped strings aan
SET backslash_quote = ON;
SET escape_string_warning = OFF; -- minder logging
Maar bij de eerste test merk ik dat lege strings door mysqldump worden geëxporteerd met twee enkele aanhalingstekens, die door PostgreSQL worden herkend als "''", een string van 2 karakters (twee keer een enkel aanhalingsteken ipv een lege string).
Dit gebeurt in ieder geval voor kolommen van het type varchar.
De brondatabase bevat voor honderden MB's aan handmatig getypte rapporten, een quick-fix als een find-replace op de dump om '' naar NULL om te zetten is geen optie helaas.
Weet iemand hiervoor een oplossing?
Toevoeging op 23/10/2015 16:50:28:
Oke, ik ben er al.
Het blijkt een niet-intuitieve quirk van pgAdmin die al 10 jaar bestaat. Dat soort domme dingen kunnen gemakkelijk op het verkeerde been zetten en meer dan een uur zoektijd kosten.
http://forums.devshed.com/postgresql-help-21/insert-empty-string-null-field-291424.html
PS: De beste methode die ik ken om te migreren van MySQL naar PostgreSQL is om de data uit MySQL te dumpen als CSV en in PostgreSQL in te lezen met COPY. Dan sla je alle brakheid van mysqldump over en in PostgreSQL is COPY verreweg de snelste manier om data in te lezen.