Vai al contenuto
Home di IntoSQL

Converti PostgreSQL in MySQL

Trascina un dump plain di pg_dump o pg_dumpall, come .sql o .sql.gz, e scarica uno script per MySQL con le stesse tabelle, chiavi, indici e dati. Ogni valore che MySQL non può contenere così com'è, e ogni oggetto che non supporta, è elencato nel report.

Il tuo file
sqlshop_2024_postgres.sqlFile di esempio, 6,2 kB
Il tuo database

18 righe convertite, 3 correzioni, nessuna rifiutata

Mostra

Tabelle in shop_2024_postgres.sqlDump PostgreSQL 18.6 · scritto da pg_dump · utf8mb4

  • customers8 righe2
    8 colonne
    idint not null
    nametext not null
    emailvarchar(768) not null
    countrychar(2) not null
    is_activetinyint(1) not null
    tagsjson not null
    signed_update
    created_atdatetime(6) not null
  • orders10 righe1
    10 colonne
    idint not null
    customer_idint not null
    statusenum('pending','paid','shipped','cancelled') not null
    totaldecimal(10,2) not null
    itemssmallint not null
    ordered_atdatetime(6) not null
    shipped_atdatetime(6)
    notetext
    detailsjson
    deliveryvarchar(100)

Non convertiti

  • Vista paid_orders

Ogni database li scrive nel proprio linguaggio. Riscrivili per MySQL.

-- Written by IntoSQL from a PostgreSQL dump. Load it with: mysql --default-character-set=utf8mb4 <database> < <file>
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
SET UNIQUE_CHECKS = 0;
SET SQL_MODE = 'NO_AUTO_VALUE_ON_ZERO,ALLOW_INVALID_DATES';

CREATE TABLE `customers` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` text NOT NULL,
  `email` varchar(768) NOT NULL,
  `country` char(2) NOT NULL DEFAULT 'US',
  `is_active` tinyint(1) NOT NULL DEFAULT 1,
  `tags` json NOT NULL,
  `signed_up` date,
  `created_at` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
  UNIQUE KEY `customers_email_key` (`email`),
  PRIMARY KEY (`id`)
) AUTO_INCREMENT=1001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='People who bought at least once';

CREATE TABLE `orders` (
  `id` int NOT NULL AUTO_INCREMENT,
  `customer_id` int NOT NULL,
  `status` enum('pending','paid','shipped','cancelled') NOT NULL DEFAULT 'pending',
  `total` decimal(10,2) NOT NULL,
  `items` smallint NOT NULL DEFAULT 1,
  `ordered_at` datetime(6) NOT NULL,
  `shipped_at` datetime(6),
  `note` text,
  `details` json,
  `delivery` varchar(100),
  PRIMARY KEY (`id`),
  KEY `idx_orders_customer` (`customer_id`),
  KEY `idx_orders_status_date` (`status`,`ordered_at`),
  CONSTRAINT `orders_total_check` CHECK (`total` >= (0)),
  CONSTRAINT `orders_customer_id_fkey` FOREIGN KEY (`customer_id`) REFERENCES `customers` (`id`)
) AUTO_INCREMENT=5001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`tags`,`signed_up`,`created_at`) VALUES (1,'Ana Martínez','ana@example.com','MX',1,'["vip"]','2023-01-15','2023-01-15 10:24:00'),(2,'Zoë Müller','zoe@example.de','DE',1,'[]','2023-02-03','2023-02-03 08:11:42'),(3,'José Peña','jose@example.es','ES',0,'["wholesale","late payer"]','2023-03-21','2023-03-21 19:05:17'),(4,'李雷','lilei@example.cn','CN',1,'[]','2023-05-09','2023-05-09 02:40:00'),(5,'Noah O\'Brien','noah@example.ie','IE',1,'[]',NULL,'2023-06-30 14:00:00'),(6,'Amélie Laurent','amelie@example.fr','FR',1,'["vip"]','2024-01-02','2024-01-02 09:30:00'),(7,'Ravi Patel','ravi@example.in','IN',0,'[]','2024-02-29','2024-02-29 23:59:59'),(8,'Sofia Rossi 🌻','sofia@example.it','IT',1,'[]','2024-04-12','2024-04-12 12:12:12');
INSERT INTO `orders` (`id`,`customer_id`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`,`details`,`delivery`) VALUES (1,1,'shipped',129.90,3,'2024-03-01 10:00:00','2024-03-02 16:30:00',NULL,'{"gift": false}','1 day 06:30:00'),(2,2,'paid',54.00,1,'2024-03-02 11:15:00',NULL,'Gift wrap 🎁','{"gift": true, "wrap": "red"}',NULL),(3,1,'cancelled',12.50,1,'2024-03-03 09:45:00',NULL,'Customer changed their mind',NULL,NULL),(4,4,'shipped',980.00,12,'2024-03-05 02:10:00','2024-03-07 08:00:00','请小心轻放','{"fragile": true}','2 days 05:50:00'),(5,5,'pending',45.75,2,'2024-03-08 17:20:00',NULL,'Leave at the door; ring twice',NULL,NULL),(6,6,'shipped',310.40,5,'2024-03-10 13:00:00','2024-03-11 09:00:00','Fragile: "glass"','{"fragile": true}','20:00:00'),(7,8,'paid',76.20,2,'2024-03-11 18:45:00',NULL,NULL,NULL,NULL),(8,2,'shipped',19.99,1,'2024-03-12 08:00:00',NULL,'Shipped date set to infinity by an old import',NULL,NULL),(9,3,'shipped',64.00,2,'2024-03-14 15:30:00','2024-03-15 10:00:00','Two parcels','{"parcels": [1, 2]}','18:30:00'),(10,7,'paid',1499.00,1,'2024-03-15 21:05:00',NULL,'C:\\Users\\ravi\\invoice.pdf',NULL,NULL);

SET UNIQUE_CHECKS = 1;
SET FOREIGN_KEY_CHECKS = 1;

Correzioni

  1. "created_at" di customers contiene istanti con fuso orario; MySQL non ha un tipo che lo conservi, quindi sono salvati in UTC come datetime(6).
  2. "tags" di customers è text[], che MySQL non ha, quindi è json con gli stessi valori.
  3. "delivery" di orders è interval, che MySQL non ha, quindi è varchar(100) con gli stessi valori.

Da controllare

  • 1 vista, trigger, routine o evento non è convertito; il report li elenca uno per uno. Ricreali a mano in MySQL.
  • Il valore predefinito di "tags" in customers non si può scrivere per MySQL (a value its type can't hold), quindi la colonna non ha un valore predefinito. Aggiungi a mano il valore predefinito se le nuove righe ne hanno bisogno.
  • L'indice idx_orders_details su orders usa un'espressione che non si può scrivere per MySQL (neither MySQL 5.7 nor MariaDB index an expression), quindi non viene creato. Crea l'indice a mano se le query ne hanno bisogno.
  • 1 valore in "shipped_at" di orders è una data che MySQL non può salvare, come infinity, quindi è NULL. MySQL salva gli anni dall'1 al 9999 senza infinito; sostituisci quelle date nella sorgente se contano.

Il tuo file viene convertito su questo computer e non viene mai caricato.

Altri esempi:

Cosa cambia da PostgreSQL a MySQL

Ogni riga è una regola che il convertitore applica, con la riga del report che scrive quando la regola cambia qualcosa nei tuoi dati.

  • boolean

    tinyint(1)

    Il BOOLEAN di MySQL è TINYINT(1): true è 1 e false è 0.

  • varchar(n), char(n), text

    varchar(n) fino a 1024 caratteri, char(n) fino a 255, text oltre

    Il testo mantiene ogni carattere come utf8mb4. Una colonna in una chiave è al massimo varchar(768), il massimo che una chiave contiene, e lo stesso vale per il testo con un valore predefinito, che MySQL 5.7 dà solo a varchar.

  • numeric(p,s) past 65 digits or 30 decimals, and numeric values past what decimal(65,30) holds

    varchar

    Il decimal di MySQL contiene 65 cifre con 30 decimali. I numeri più ampi restano testo così ogni cifra resta esatta; numeric senza precisione è decimal(65,30) quando i valori ci stanno.

    Riga del report: decimal_as_text

  • money

    decimal(19,2)

    MySQL non ha un tipo money. L'importo resta un numero, senza il simbolo di valuta aggiunto dal locale del server.

    Riga del report: type_replaced

  • interval

    varchar(100) con il testo di PostgreSQL

    Il TIME di MySQL contiene durate fino a 838 ore, ma un interval ha mesi e giorni; il suo testo mantiene ogni parte.

    Riga del report: type_replaced

  • arrays (integer[], text[]...)

    array json

    MySQL non ha array. Un array JSON mantiene ogni elemento e i NULL, e le funzioni JSON lo leggono.

    Riga del report: type_replaced

  • ranges, geometric types, tsvector, xml, hstore, composite and extension types

    longtext con il testo di PostgreSQL

    MySQL non ha un tipo equivalente, quindi ogni valore mantiene il testo scritto da PostgreSQL.

    Riga del report: type_replaced

  • json, jsonb

    json

    Gli stessi valori JSON; l'ordine delle chiavi e gli spazi di jsonb sono quelli del server.

  • timestamp

    datetime(p)

    Un timestamp senza fuso orario è l'ora letta su un orologio, come datetime.

  • timestamp with time zone

    datetime(p) in UTC

    Il TIMESTAMP di MySQL arriva solo al 2038, quindi gli istanti sono salvati come datetime in UTC, lo stesso istante qualunque offset abbia scritto il dump.

    Riga del report: moments_as_utc

  • time

    time(p)

    Il TIME di MySQL contiene ogni ora del giorno, 24:00:00 inclusa.

  • infinity, -infinity, BC dates and years past 9999

    NULL

    MySQL salva gli anni dal 1000 al 9999 senza infinito. Quei valori diventano NULL e il report li conta.

    Riga del report: date_out_of_range

  • NaN and Infinity in numeric, real and double precision

    NULL

    I numeri di MySQL non hanno NaN né Infinity, quindi quei valori diventano NULL e il report li conta.

    Riga del report: invalid_value_null

  • NOT NULL columns with values that become NULL

    NOT NULL rimosso

    Una colonna i cui valori sono dovuti diventare NULL non può mantenere NOT NULL, altrimenti il caricamento si fermerebbe.

    Riga del report: not_null_relaxed

  • enum types

    enum(...) con le stesse etichette

    L'ENUM di MySQL mantiene le etichette nel loro ordine.

  • uuid, inet, cidr

    uuid come char(36), inet e cidr come varchar(43)

    MySQL non ha tipi uuid né per indirizzi; il testo mantiene ogni valore.

  • bytea

    blob, mediumblob o longblob; varbinary(3072) in una chiave

    I byte restano byte.

  • bit(n)

    bit(n) fino a 64, testo oltre

    Una stringa di bit fino a 64 bit è il numero formato dai suoi bit; una più lunga mantiene le sue cifre.

  • citext and nondeterministic collations

    confronto esatto

    Le tabelle usano utf8mb4_bin così il testo si confronta in modo esatto, come in PostgreSQL; le colonne che ignoravano le maiuscole nella sorgente lo perdono.

    Riga del report: case_insensitive_collation

  • serial, identity

    AUTO_INCREMENT, che riparte dopo l'id più alto

    Conta la colonna che apre la chiave primaria; il contatore riparte da dove era la sequenza.

  • a second serial or identity column in a table

    intero semplice

    MySQL conta una colonna per tabella; ogni altra mantiene i suoi valori senza contatore.

    Riga del report: counter_dropped

  • sequences not owned by a column

    non creato

    MySQL non ha sequenze. Le colonne che contano con una diventano invece AUTO_INCREMENT.

    Riga del report: sequence_not_converted

  • generated columns

    colonne generate, STORED come nella sorgente

    MySQL le calcola allo stesso modo.

  • generated columns with functions MySQL lacks

    una colonna semplice

    Una formula che non si può scrivere per MySQL lascia una colonna semplice e una riga nel report.

    Riga del report: generated_not_translated

  • defaults with functions MySQL lacks, and defaults from a sequence

    nessun valore predefinito

    Un valore predefinito che non si può scrivere per MySQL viene omesso e segnalato.

    Riga del report: default_not_translated

  • CHECK constraints

    tradotti, dentro CREATE TABLE

    MySQL 8.0.16 e MariaDB li applicano; MySQL 5.7 li mantiene senza verificarli.

  • CHECK constraints with functions MySQL lacks

    non creato

    Un vincolo CHECK che non si può scrivere per MySQL viene omesso e segnalato.

    Riga del report: check_skipped

  • CHECK ... NOT VALID

    non creato

    PostgreSQL non ha mai verificato le righe che c'erano prima, quindi potrebbero violarlo.

    Riga del report: check_not_valid

  • gin, gist, brin and hash indexes, partial and expression indexes

    non creato

    MySQL ha solo indici b-tree, full-text e spaziali, su colonne intere, senza WHERE.

    Riga del report: index_skipped

  • foreign keys

    chiavi esterne, caricate con FOREIGN_KEY_CHECKS=0

    Le righe si caricano in qualsiasi ordine, e le chiavi verificano le nuove righe dopo.

  • foreign keys to tables the dump doesn't create

    non creato

    Una chiave non può riferirsi a una tabella che non c'è.

    Riga del report: foreign_key_skipped

  • partitioned tables

    una tabella con le righe di ogni partizione

    Le righe sono le stesse; partiziona di nuovo la tabella in MySQL se serve.

    Riga del report: partitions_dropped

  • schemas

    un database, tabelle con il nome del loro schema davanti

    Gli schemi di MySQL sono database, che uno script caricato in un solo database non può creare; le tabelle in public mantengono il loro nome.

    Riga del report: schemas_merged

  • views, functions, procedures, triggers, rules, policies, extensions and types

    elencati nel report

    Il loro codice è scritto nel linguaggio di PostgreSQL, quindi vengono elencati perché tu li ricrei.

    Riga del report: not_converted_objects

  • dumps without CREATE TABLE (--data-only)

    tipi ricavati dai valori

    Un dump di soli dati contiene solo righe, quindi i tipi vengono ricavati dai valori.

    Riga del report: no_schema

  • expressions in INSERT values

    NULL

    Un convertitore che non esegue un database non può valutarle.

    Riga del report: expression_value

  • types IntoSQL doesn't know

    longtext

    Il testo contiene qualsiasi valore; cambia il tipo dopo il caricamento.

    Riga del report: unknown_type

  • text that isn't valid in its encoding

    i byte errati come carattere di sostituzione

    Il testo deve essere utf8mb4 valido.

    Riga del report: invalid_utf8_replaced

  • text decoded twice (ñ)

    copiato così com'è

    Il dump contiene esattamente questi caratteri, quindi vengono copiati; il report li segnala.

    Riga del report: mojibake_suspected

In PostgreSQLIn MySQLRiga del report
booleantinyint(1)Il BOOLEAN di MySQL è TINYINT(1): true è 1 e false è 0.
varchar(n), char(n), textvarchar(n) fino a 1024 caratteri, char(n) fino a 255, text oltreIl testo mantiene ogni carattere come utf8mb4. Una colonna in una chiave è al massimo varchar(768), il massimo che una chiave contiene, e lo stesso vale per il testo con un valore predefinito, che MySQL 5.7 dà solo a varchar.
numeric(p,s) past 65 digits or 30 decimals, and numeric values past what decimal(65,30) holdsvarcharIl decimal di MySQL contiene 65 cifre con 30 decimali. I numeri più ampi restano testo così ogni cifra resta esatta; numeric senza precisione è decimal(65,30) quando i valori ci stanno.decimal_as_text
moneydecimal(19,2)MySQL non ha un tipo money. L'importo resta un numero, senza il simbolo di valuta aggiunto dal locale del server.type_replaced
intervalvarchar(100) con il testo di PostgreSQLIl TIME di MySQL contiene durate fino a 838 ore, ma un interval ha mesi e giorni; il suo testo mantiene ogni parte.type_replaced
arrays (integer[], text[]...)array jsonMySQL non ha array. Un array JSON mantiene ogni elemento e i NULL, e le funzioni JSON lo leggono.type_replaced
ranges, geometric types, tsvector, xml, hstore, composite and extension typeslongtext con il testo di PostgreSQLMySQL non ha un tipo equivalente, quindi ogni valore mantiene il testo scritto da PostgreSQL.type_replaced
json, jsonbjsonGli stessi valori JSON; l'ordine delle chiavi e gli spazi di jsonb sono quelli del server.
timestampdatetime(p)Un timestamp senza fuso orario è l'ora letta su un orologio, come datetime.
timestamp with time zonedatetime(p) in UTCIl TIMESTAMP di MySQL arriva solo al 2038, quindi gli istanti sono salvati come datetime in UTC, lo stesso istante qualunque offset abbia scritto il dump.moments_as_utc
timetime(p)Il TIME di MySQL contiene ogni ora del giorno, 24:00:00 inclusa.
infinity, -infinity, BC dates and years past 9999NULLMySQL salva gli anni dal 1000 al 9999 senza infinito. Quei valori diventano NULL e il report li conta.date_out_of_range
NaN and Infinity in numeric, real and double precisionNULLI numeri di MySQL non hanno NaN né Infinity, quindi quei valori diventano NULL e il report li conta.invalid_value_null
NOT NULL columns with values that become NULLNOT NULL rimossoUna colonna i cui valori sono dovuti diventare NULL non può mantenere NOT NULL, altrimenti il caricamento si fermerebbe.not_null_relaxed
enum typesenum(...) con le stesse etichetteL'ENUM di MySQL mantiene le etichette nel loro ordine.
uuid, inet, cidruuid come char(36), inet e cidr come varchar(43)MySQL non ha tipi uuid né per indirizzi; il testo mantiene ogni valore.
byteablob, mediumblob o longblob; varbinary(3072) in una chiaveI byte restano byte.
bit(n)bit(n) fino a 64, testo oltreUna stringa di bit fino a 64 bit è il numero formato dai suoi bit; una più lunga mantiene le sue cifre.
citext and nondeterministic collationsconfronto esattoLe tabelle usano utf8mb4_bin così il testo si confronta in modo esatto, come in PostgreSQL; le colonne che ignoravano le maiuscole nella sorgente lo perdono.case_insensitive_collation
serial, identityAUTO_INCREMENT, che riparte dopo l'id più altoConta la colonna che apre la chiave primaria; il contatore riparte da dove era la sequenza.
a second serial or identity column in a tableintero sempliceMySQL conta una colonna per tabella; ogni altra mantiene i suoi valori senza contatore.counter_dropped
sequences not owned by a columnnon creatoMySQL non ha sequenze. Le colonne che contano con una diventano invece AUTO_INCREMENT.sequence_not_converted
generated columnscolonne generate, STORED come nella sorgenteMySQL le calcola allo stesso modo.
generated columns with functions MySQL lacksuna colonna sempliceUna formula che non si può scrivere per MySQL lascia una colonna semplice e una riga nel report.generated_not_translated
defaults with functions MySQL lacks, and defaults from a sequencenessun valore predefinitoUn valore predefinito che non si può scrivere per MySQL viene omesso e segnalato.default_not_translated
CHECK constraintstradotti, dentro CREATE TABLEMySQL 8.0.16 e MariaDB li applicano; MySQL 5.7 li mantiene senza verificarli.
CHECK constraints with functions MySQL lacksnon creatoUn vincolo CHECK che non si può scrivere per MySQL viene omesso e segnalato.check_skipped
CHECK ... NOT VALIDnon creatoPostgreSQL non ha mai verificato le righe che c'erano prima, quindi potrebbero violarlo.check_not_valid
gin, gist, brin and hash indexes, partial and expression indexesnon creatoMySQL ha solo indici b-tree, full-text e spaziali, su colonne intere, senza WHERE.index_skipped
foreign keyschiavi esterne, caricate con FOREIGN_KEY_CHECKS=0Le righe si caricano in qualsiasi ordine, e le chiavi verificano le nuove righe dopo.
foreign keys to tables the dump doesn't createnon creatoUna chiave non può riferirsi a una tabella che non c'è.foreign_key_skipped
partitioned tablesuna tabella con le righe di ogni partizioneLe righe sono le stesse; partiziona di nuovo la tabella in MySQL se serve.partitions_dropped
schemasun database, tabelle con il nome del loro schema davantiGli schemi di MySQL sono database, che uno script caricato in un solo database non può creare; le tabelle in public mantengono il loro nome.schemas_merged
views, functions, procedures, triggers, rules, policies, extensions and typeselencati nel reportIl loro codice è scritto nel linguaggio di PostgreSQL, quindi vengono elencati perché tu li ricrei.not_converted_objects
dumps without CREATE TABLE (--data-only)tipi ricavati dai valoriUn dump di soli dati contiene solo righe, quindi i tipi vengono ricavati dai valori.no_schema
expressions in INSERT valuesNULLUn convertitore che non esegue un database non può valutarle.expression_value
types IntoSQL doesn't knowlongtextIl testo contiene qualsiasi valore; cambia il tipo dopo il caricamento.unknown_type
text that isn't valid in its encodingi byte errati come carattere di sostituzioneIl testo deve essere utf8mb4 valido.invalid_utf8_replaced
text decoded twice (ñ)copiato così com'èIl dump contiene esattamente questi caratteri, quindi vengono copiati; il report li segnala.mojibake_suspected

Carica lo script in MySQL

Lo script crea le tabelle, copia le righe, poi aggiunge chiavi, indici e chiavi esterne, così si carica in fretta e si ferma al primo errore.

mysql --default-character-set=utf8mb4 mydb < postgresql.mysql.sql

Le chiavi esterne vengono create come le dichiara il dump, con FOREIGN_KEY_CHECKS=0 mentre le righe si caricano, così una riga che punta a una riga mancante non ferma il caricamento.

Per un dump grande, esegui il client sulla stessa macchina del server, e aumenta max_allowed_packet se una singola riga è molto grande.

IntoSQL Pro carica il file direttamente in MySQL dall'app desktop o dalla riga di comando, senza scrivere uno script.

Fai il dump di PostgreSQL per il miglior risultato

Il convertitore legge ciò che il dump contiene. Con queste opzioni il dump conserva più dei tuoi dati:

  • --format=plain, il default di pg_dump, scrive SQL. Un archivio custom o directory (-Fc, -Fd) diventa SQL con pg_restore -f dump.sql, senza un server di database.
  • --no-owner --no-privileges escludono ruoli e permessi, che il convertitore comunque salta, così il dump è più piccolo.
  • pg_dumpall esporta ogni database in un solo file; le tabelle di ognuno hanno il suo nome davanti, così niente entra in conflitto.

Cosa non viene convertito

Viste, viste materializzate, funzioni, procedure, trigger, regole, policy di sicurezza a livello di riga, estensioni e tipi sono scritti nel linguaggio di PostgreSQL. Sono elencati per nome nel report, mai rimossi in silenzio, così puoi riscriverli per MySQL.

Domande sulla conversione da PostgreSQL a MySQL

Non trovi la risposta? Scrivici dalla pagina dei contatti e ti risponde una persona. Pagina dei contatti

Il mio dump viene caricato?

No. Il convertitore funziona nel tuo browser e legge il dump dal tuo disco a pezzi, quindi non lascia mai il tuo computer. Anche l'app desktop e la riga di comando convertono sul tuo computer.

Quanto può essere grande il dump?

Il convertitore non tiene mai l'intero dump in memoria: legge il file due volte, per intervalli, e scrive lo script man mano. I dump di più gigabyte si convertono nel browser, nell'app desktop e con la riga di comando.

Legge gli archivi pg_dump -Fc?

Non direttamente: un archivio custom è un formato binario. pg_restore -f dump.sql dump.backup lo trasforma nel SQL plain che il convertitore legge, senza connettersi a un server. Il convertitore lo dice quando riceve un archivio.

Da quali versioni di PostgreSQL può provenire il dump?

Dump scritti da pg_dump e pg_dumpall da PostgreSQL 10 in poi, con righe COPY o INSERT. Ogni dump di test viene da PostgreSQL 13 e 18 ed è confrontato con la sorgente cella per cella.

I valori serial e identity vengono mantenuti?

Sì, per una colonna per tabella: la colonna serial o identity che apre la chiave primaria diventa AUTO_INCREMENT e riparte dopo l'id più alto. MySQL conta una colonna per tabella, quindi ogni altra mantiene i suoi valori senza contatore, e il report lo dice.

Cosa succede ad array, enum e altri tipi di PostgreSQL?

Gli array diventano array JSON, i booleani tinyint(1), gli enum ENUM con le stesse etichette e money un decimal. Range, tipi geometrici, hstore e tipi composti mantengono il testo di PostgreSQL, e il report dice quali colonne.

E funzioni, trigger e viste?

Sono elencati per nome nel report e non vengono convertiti, perché ogni database li scrive nel proprio linguaggio.

Su quali versioni di MySQL si carica lo script?

MySQL 5.7 e successive. Ogni dump di test si carica su 5.7 e 9, fermandosi al primo errore se qualcosa va storto.