Pular para o conteúdo
Início do IntoSQL

Converta PostgreSQL para MySQL

Solte um dump simples do pg_dump ou pg_dumpall, em .sql ou .sql.gz, e baixe um script do MySQL com as mesmas tabelas, chaves, índices e dados. Cada valor que o MySQL não aceita como está, e cada objeto que ele não traz, aparece no relatório.

Seu arquivo
sqlshop_2024_postgres.sqlArquivo de exemplo, 6,2 kB
Seu banco de dados

18 linhas convertidas, 3 correções, nenhuma rejeitada

Mostrar

Tabelas em shop_2024_postgres.sqlDump do PostgreSQL 18.6 · gerado por pg_dump · utf8mb4

  • customers8 linhas2
    8 colunas
    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 linhas1
    10 colunas
    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)

Não convertidos

  • Visão paid_orders

Cada banco de dados escreve estes objetos na sua própria linguagem. Reescreva-os para o 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;

Correções

  1. "created_at" de customers contém instantes com fuso horário; o MySQL não tem um tipo que o mantenha, então eles são guardados em UTC como datetime(6).
  2. "tags" de customers é text[], que o MySQL não tem, então vira json com os mesmos valores.
  3. "delivery" de orders é interval, que o MySQL não tem, então vira varchar(100) com os mesmos valores.

Para revisar

  • 1 visão, gatilho, rotina ou evento não foi convertido; o relatório lista cada um. Recrie-os manualmente no MySQL.
  • O valor padrão de "tags" em customers não pode ser escrito para o MySQL (a value its type can't hold), então a coluna fica sem valor padrão. Adicione o valor padrão manualmente se novas linhas precisarem dele.
  • O índice idx_orders_details de orders usa uma expressão que não pode ser escrita para o MySQL (neither MySQL 5.7 nor MariaDB index an expression), então não é criado. Crie o índice manualmente se as consultas precisarem dele.
  • 1 valor em "shipped_at" de orders é uma data que o MySQL não consegue guardar, como infinity, então ficou NULL. O MySQL guarda os anos de 1 a 9999 sem infinito; substitua essas datas na origem se elas forem importantes.

Seu arquivo é convertido neste computador e nunca é enviado.

Outros exemplos:

O que muda do PostgreSQL para o MySQL

Cada linha é uma regra que o conversor aplica, com a linha do relatório que ele escreve quando a regra muda algo nos seus dados.

  • boolean

    tinyint(1)

    O BOOLEAN do MySQL é TINYINT(1): true é 1 e false é 0.

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

    varchar(n) até 1024 caracteres, char(n) até 255, text acima disso

    O texto mantém cada caractere como utf8mb4. Uma coluna em uma chave é no máximo varchar(768), o maior que uma chave comporta, e o mesmo vale para texto com valor padrão, que o MySQL 5.7 só dá a varchar.

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

    varchar

    O decimal do MySQL comporta 65 dígitos com 30 decimais. Números mais largos ficam como texto, para que cada dígito continue exato; numeric sem precisão vira decimal(65,30) quando seus valores cabem.

    Linha do relatório: decimal_as_text

  • money

    decimal(19,2)

    O MySQL não tem tipo money. O valor fica como número, sem o símbolo de moeda que a localidade do servidor adicionou.

    Linha do relatório: type_replaced

  • interval

    varchar(100) com o texto do PostgreSQL

    O TIME do MySQL guarda durações de até 838 horas, mas um interval tem meses e dias; o texto dele mantém cada parte.

    Linha do relatório: type_replaced

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

    arrays json

    O MySQL não tem arrays. Um array JSON mantém cada item e NULL, e as funções JSON o leem.

    Linha do relatório: type_replaced

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

    longtext com o texto do PostgreSQL

    O MySQL não tem um tipo equivalente, então cada valor mantém o texto que o PostgreSQL escreveu.

    Linha do relatório: type_replaced

  • json, jsonb

    json

    Os mesmos valores JSON; a ordem das chaves e os espaços do jsonb são os do servidor.

  • timestamp

    datetime(p)

    Um timestamp sem fuso horário é a leitura de um relógio de parede, como o datetime.

  • timestamp with time zone

    datetime(p) em UTC

    O TIMESTAMP do MySQL só vai até 2038, então os instantes são guardados como datetime em UTC, o mesmo instante qualquer que seja o fuso que o dump escreveu.

    Linha do relatório: moments_as_utc

  • time

    time(p)

    O TIME do MySQL guarda qualquer hora do dia, incluindo 24:00:00.

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

    NULL

    O MySQL guarda os anos de 1000 a 9999 sem infinito. Esses valores viram NULL e o relatório os conta.

    Linha do relatório: date_out_of_range

  • NaN and Infinity in numeric, real and double precision

    NULL

    Os números do MySQL não têm NaN nem Infinity, então esses valores viram NULL e o relatório os conta.

    Linha do relatório: invalid_value_null

  • NOT NULL columns with values that become NULL

    NOT NULL removido

    Uma coluna cujos valores tiveram de virar NULL não pode manter NOT NULL, senão a carga pararia.

    Linha do relatório: not_null_relaxed

  • enum types

    enum(...) com os mesmos rótulos

    O ENUM do MySQL mantém os rótulos na sua ordem.

  • uuid, inet, cidr

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

    O MySQL não tem tipos uuid nem de endereço; o texto mantém cada valor.

  • bytea

    blob, mediumblob ou longblob; varbinary(3072) em uma chave

    Bytes continuam bytes.

  • bit(n)

    bit(n) até 64, text acima disso

    Uma string de bits de até 64 bits é o número que seus bits formam; uma mais longa mantém seus dígitos.

  • citext and nondeterministic collations

    comparação exata

    As tabelas usam utf8mb4_bin, então o texto é comparado de forma exata, como no PostgreSQL; colunas que ignoravam maiúsculas na origem perdem isso.

    Linha do relatório: case_insensitive_collation

  • serial, identity

    AUTO_INCREMENT, continuando depois do maior id

    A coluna que inicia a chave primária conta; o contador continua de onde a sequência estava.

  • a second serial or identity column in a table

    inteiro simples

    O MySQL conta uma coluna por tabela; qualquer outra mantém seus valores sem contador.

    Linha do relatório: counter_dropped

  • sequences not owned by a column

    não criada

    O MySQL não tem sequências. Colunas que contam com uma viram AUTO_INCREMENT.

    Linha do relatório: sequence_not_converted

  • generated columns

    colunas geradas, STORED como na origem

    O MySQL as calcula do mesmo jeito.

  • generated columns with functions MySQL lacks

    uma coluna simples

    Uma fórmula que não pode ser escrita para o MySQL deixa uma coluna simples e uma linha no relatório.

    Linha do relatório: generated_not_translated

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

    sem valor padrão

    Um valor padrão que não pode ser escrito para o MySQL fica de fora e é informado.

    Linha do relatório: default_not_translated

  • CHECK constraints

    traduzido, dentro do CREATE TABLE

    O MySQL 8.0.16 e o MariaDB os aplicam; o MySQL 5.7 os mantém sem verificar.

  • CHECK constraints with functions MySQL lacks

    não criado

    Um CHECK que não pode ser escrito para o MySQL fica de fora e é informado.

    Linha do relatório: check_skipped

  • CHECK ... NOT VALID

    não criado

    O PostgreSQL nunca verificou as linhas que já existiam, então elas podem violá-lo.

    Linha do relatório: check_not_valid

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

    não criado

    O MySQL só tem índices b-tree, de texto completo e espaciais, sobre colunas inteiras, sem WHERE.

    Linha do relatório: index_skipped

  • foreign keys

    chaves estrangeiras, carregadas com FOREIGN_KEY_CHECKS=0

    As linhas carregam em qualquer ordem, e as chaves verificam as linhas novas depois.

  • foreign keys to tables the dump doesn't create

    não criada

    Uma chave não pode apontar para uma tabela que não existe.

    Linha do relatório: foreign_key_skipped

  • partitioned tables

    uma tabela com as linhas de todas as partições

    As linhas são as mesmas; particione a tabela de novo no MySQL se precisar.

    Linha do relatório: partitions_dropped

  • schemas

    um banco de dados, tabelas com o nome do schema na frente

    Os schemas do MySQL são bancos de dados, que um script carregado em um único banco não pode criar; as tabelas de public mantêm seus nomes.

    Linha do relatório: schemas_merged

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

    listados no relatório

    O código deles é escrito na linguagem do PostgreSQL, então eles são listados para você recriá-los.

    Linha do relatório: not_converted_objects

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

    tipos lidos dos valores

    Um dump só de dados tem apenas linhas, então os tipos vêm dos valores.

    Linha do relatório: no_schema

  • expressions in INSERT values

    NULL

    Um conversor que não executa um banco de dados não consegue avaliá-las.

    Linha do relatório: expression_value

  • types IntoSQL doesn't know

    longtext

    O texto aceita qualquer valor; mude o tipo depois da carga.

    Linha do relatório: unknown_type

  • text that isn't valid in its encoding

    os bytes inválidos como o caractere de substituição

    O texto precisa ser utf8mb4 válido.

    Linha do relatório: invalid_utf8_replaced

  • text decoded twice (ñ)

    copiado como está

    O dump contém exatamente esses caracteres, então eles são copiados; o relatório os aponta.

    Linha do relatório: mojibake_suspected

No PostgreSQLNo MySQLLinha do relatório
booleantinyint(1)O BOOLEAN do MySQL é TINYINT(1): true é 1 e false é 0.
varchar(n), char(n), textvarchar(n) até 1024 caracteres, char(n) até 255, text acima dissoO texto mantém cada caractere como utf8mb4. Uma coluna em uma chave é no máximo varchar(768), o maior que uma chave comporta, e o mesmo vale para texto com valor padrão, que o MySQL 5.7 só dá a varchar.
numeric(p,s) past 65 digits or 30 decimals, and numeric values past what decimal(65,30) holdsvarcharO decimal do MySQL comporta 65 dígitos com 30 decimais. Números mais largos ficam como texto, para que cada dígito continue exato; numeric sem precisão vira decimal(65,30) quando seus valores cabem.decimal_as_text
moneydecimal(19,2)O MySQL não tem tipo money. O valor fica como número, sem o símbolo de moeda que a localidade do servidor adicionou.type_replaced
intervalvarchar(100) com o texto do PostgreSQLO TIME do MySQL guarda durações de até 838 horas, mas um interval tem meses e dias; o texto dele mantém cada parte.type_replaced
arrays (integer[], text[]...)arrays jsonO MySQL não tem arrays. Um array JSON mantém cada item e NULL, e as funções JSON o leem.type_replaced
ranges, geometric types, tsvector, xml, hstore, composite and extension typeslongtext com o texto do PostgreSQLO MySQL não tem um tipo equivalente, então cada valor mantém o texto que o PostgreSQL escreveu.type_replaced
json, jsonbjsonOs mesmos valores JSON; a ordem das chaves e os espaços do jsonb são os do servidor.
timestampdatetime(p)Um timestamp sem fuso horário é a leitura de um relógio de parede, como o datetime.
timestamp with time zonedatetime(p) em UTCO TIMESTAMP do MySQL só vai até 2038, então os instantes são guardados como datetime em UTC, o mesmo instante qualquer que seja o fuso que o dump escreveu.moments_as_utc
timetime(p)O TIME do MySQL guarda qualquer hora do dia, incluindo 24:00:00.
infinity, -infinity, BC dates and years past 9999NULLO MySQL guarda os anos de 1000 a 9999 sem infinito. Esses valores viram NULL e o relatório os conta.date_out_of_range
NaN and Infinity in numeric, real and double precisionNULLOs números do MySQL não têm NaN nem Infinity, então esses valores viram NULL e o relatório os conta.invalid_value_null
NOT NULL columns with values that become NULLNOT NULL removidoUma coluna cujos valores tiveram de virar NULL não pode manter NOT NULL, senão a carga pararia.not_null_relaxed
enum typesenum(...) com os mesmos rótulosO ENUM do MySQL mantém os rótulos na sua ordem.
uuid, inet, cidruuid como char(36), inet e cidr como varchar(43)O MySQL não tem tipos uuid nem de endereço; o texto mantém cada valor.
byteablob, mediumblob ou longblob; varbinary(3072) em uma chaveBytes continuam bytes.
bit(n)bit(n) até 64, text acima dissoUma string de bits de até 64 bits é o número que seus bits formam; uma mais longa mantém seus dígitos.
citext and nondeterministic collationscomparação exataAs tabelas usam utf8mb4_bin, então o texto é comparado de forma exata, como no PostgreSQL; colunas que ignoravam maiúsculas na origem perdem isso.case_insensitive_collation
serial, identityAUTO_INCREMENT, continuando depois do maior idA coluna que inicia a chave primária conta; o contador continua de onde a sequência estava.
a second serial or identity column in a tableinteiro simplesO MySQL conta uma coluna por tabela; qualquer outra mantém seus valores sem contador.counter_dropped
sequences not owned by a columnnão criadaO MySQL não tem sequências. Colunas que contam com uma viram AUTO_INCREMENT.sequence_not_converted
generated columnscolunas geradas, STORED como na origemO MySQL as calcula do mesmo jeito.
generated columns with functions MySQL lacksuma coluna simplesUma fórmula que não pode ser escrita para o MySQL deixa uma coluna simples e uma linha no relatório.generated_not_translated
defaults with functions MySQL lacks, and defaults from a sequencesem valor padrãoUm valor padrão que não pode ser escrito para o MySQL fica de fora e é informado.default_not_translated
CHECK constraintstraduzido, dentro do CREATE TABLEO MySQL 8.0.16 e o MariaDB os aplicam; o MySQL 5.7 os mantém sem verificar.
CHECK constraints with functions MySQL lacksnão criadoUm CHECK que não pode ser escrito para o MySQL fica de fora e é informado.check_skipped
CHECK ... NOT VALIDnão criadoO PostgreSQL nunca verificou as linhas que já existiam, então elas podem violá-lo.check_not_valid
gin, gist, brin and hash indexes, partial and expression indexesnão criadoO MySQL só tem índices b-tree, de texto completo e espaciais, sobre colunas inteiras, sem WHERE.index_skipped
foreign keyschaves estrangeiras, carregadas com FOREIGN_KEY_CHECKS=0As linhas carregam em qualquer ordem, e as chaves verificam as linhas novas depois.
foreign keys to tables the dump doesn't createnão criadaUma chave não pode apontar para uma tabela que não existe.foreign_key_skipped
partitioned tablesuma tabela com as linhas de todas as partiçõesAs linhas são as mesmas; particione a tabela de novo no MySQL se precisar.partitions_dropped
schemasum banco de dados, tabelas com o nome do schema na frenteOs schemas do MySQL são bancos de dados, que um script carregado em um único banco não pode criar; as tabelas de public mantêm seus nomes.schemas_merged
views, functions, procedures, triggers, rules, policies, extensions and typeslistados no relatórioO código deles é escrito na linguagem do PostgreSQL, então eles são listados para você recriá-los.not_converted_objects
dumps without CREATE TABLE (--data-only)tipos lidos dos valoresUm dump só de dados tem apenas linhas, então os tipos vêm dos valores.no_schema
expressions in INSERT valuesNULLUm conversor que não executa um banco de dados não consegue avaliá-las.expression_value
types IntoSQL doesn't knowlongtextO texto aceita qualquer valor; mude o tipo depois da carga.unknown_type
text that isn't valid in its encodingos bytes inválidos como o caractere de substituiçãoO texto precisa ser utf8mb4 válido.invalid_utf8_replaced
text decoded twice (ñ)copiado como estáO dump contém exatamente esses caracteres, então eles são copiados; o relatório os aponta.mojibake_suspected

Carregue o script no MySQL

O script cria as tabelas, copia as linhas e depois adiciona chaves, índices e chaves estrangeiras, então carrega rápido e para no primeiro erro.

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

As chaves estrangeiras são criadas como o dump as declara, com FOREIGN_KEY_CHECKS=0 enquanto as linhas carregam, então uma linha que aponta para uma linha que não existe não para a carga.

Para um dump grande, execute o cliente na mesma máquina do servidor e aumente max_allowed_packet se uma única linha for muito grande.

O IntoSQL Pro carrega o arquivo direto no MySQL pelo app para desktop ou pela linha de comando, sem escrever um script.

Gere o dump do PostgreSQL para o melhor resultado

O conversor lê o que o dump contém. Estas opções mantêm mais dos seus dados nele:

  • --format=plain, o padrão do pg_dump, escreve SQL. Um arquivo custom ou de diretório (-Fc, -Fd) vira SQL com pg_restore -f dump.sql, sem servidor de banco de dados.
  • --no-owner --no-privileges deixam de fora papéis e permissões, que o conversor ignora de qualquer forma, então o dump fica menor.
  • O pg_dumpall gera o dump de todos os bancos de dados em um arquivo; as tabelas de cada um recebem o nome dele, então nada colide.

O que não é convertido

Visões, visões materializadas, funções, procedimentos, gatilhos, regras, políticas de segurança de linha, extensões e tipos são escritos na linguagem própria do PostgreSQL. Eles aparecem no relatório pelo nome, nunca são descartados em silêncio, para que você possa reescrevê-los para o MySQL.

Perguntas sobre PostgreSQL para MySQL

Não encontrou a resposta? Escreva para nós pela página de contato e uma pessoa responde. Página de contato

Meu dump é enviado?

Não. O conversor roda no seu navegador e lê o dump do seu disco em partes, então ele nunca sai do seu computador. O app para desktop e a linha de comando também convertem no seu computador.

Qual o tamanho máximo do dump?

O conversor nunca guarda o dump inteiro na memória: ele lê o arquivo duas vezes, por intervalos, e escreve o script à medida que avança. Dumps de vários gigabytes são convertidos no navegador, no app para desktop e com a linha de comando.

Ele lê arquivos do pg_dump -Fc?

Não diretamente: um arquivo custom é um formato binário. pg_restore -f dump.sql dump.backup o transforma no SQL simples que o conversor lê, sem se conectar a um servidor. O conversor avisa quando recebe um arquivo desses.

De quais versões do PostgreSQL o dump pode vir?

Dumps escritos pelo pg_dump e pg_dumpall do PostgreSQL 10 em diante, com linhas em COPY ou INSERT. Cada dump de teste vem do PostgreSQL 13 e 18 e é comparado com a origem célula por célula.

Os valores serial e identity são mantidos?

Sim, para uma coluna por tabela: a coluna serial ou identity que inicia a chave primária vira AUTO_INCREMENT e continua depois do maior id. O MySQL conta uma coluna por tabela, então qualquer outra mantém seus valores sem contador, e o relatório avisa.

O que acontece com arrays, enums e outros tipos do PostgreSQL?

Arrays viram arrays JSON, booleanos tinyint(1), enums ENUM com os mesmos rótulos, e money um decimal. Ranges, tipos geométricos, hstore e tipos compostos mantêm o texto do PostgreSQL, e o relatório diz quais colunas.

E as funções, gatilhos e visões?

Eles aparecem no relatório pelo nome e não são convertidos, porque cada banco de dados os escreve na sua própria linguagem.

Em quais versões do MySQL o script carrega?

MySQL 5.7 e posteriores. Cada dump de teste carrega no 5.7 e no 9 e para no primeiro erro se algo der errado.