Van MySQL naar PostgreSQL -- PG herkent '' niet als lege string

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

23/10/2015 15:57:08
Quote Anchor link
Met het omzetten van MySQL naar PostgreSQL loop ik tegen een paar issues aan. De meeste zijn te fixen, maar omdat ik nieuw ben bij PostgreSQL (wel ervaring met andere RDBMS-en) ben ik afhankelijk van de fora op internet, en daarop heb ik nog geen oplossing gevonden voor het laatste issue.

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)
PHP script in nieuw venster Selecteer het PHP script
1
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

Om vervolgens de hexadecimale kolommen aan te passen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
sed "s/0x\([0-9A-F]*\)/decode('\1','hex')/g" dump.sql > dump_pg.sql


Vervolgens wil ik de data inladen. Ik test dit met pgAdmin3, en heb vooraf de volgende compatibiliteitsinstellingen moeten maken:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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


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
Gewijzigd op 23/10/2015 16:04:11 door
 
PHP hulp

PHP hulp

06/12/2024 09:18:08
 
Pg Vincent

Pg Vincent

31/10/2015 12:28:18
Quote Anchor link
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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.