İçeriğe geç

MySQL dökümlerini PostgreSQL için dönüştürün

mysqldump, mariadb-dump, mysqlpump, phpMyAdmin veya Adminer ile alınmış bir dökümü .sql veya .sql.gz olarak bırakın ve aynı tablolar, anahtarlar, indeksler ve verilerle bir PostgreSQL betiği indirin. PostgreSQL tarafından olduğu gibi tutulamayan her değer ve taşınmayan her nesne raporda listelenir.

Dosyanız
sqlshop_2024.sqlÖrnek dosya, 5,1 kB
Veritabanınız

18 satır dönüştürüldü, 8 düzeltme, reddedilen yok

Göster

shop_2024.sql içindeki tablolarMySQL 8.0.46 dökümü · mysqldump ile yazıldı · utf8mb4

  • customers8 satır3
    7 sütun
    idbigint not null
    namevarchar(100) not null
    emailvarchar(150) not null
    countryvarchar(2) not null
    is_activeboolean not null
    signed_update
    created_attimestamptz(0) not null
  • orders10 satır5
    9 sütun
    idbigint not null
    customer_idbigint not null
    statustext not null
    totalnumeric(10,2) not null
    itemsinteger not null
    ordered_attimestamp(0) not null
    shipped_attimestamp(0)
    notevarchar(255)
    updated_attimestamptz(0) not null
-- Written by IntoSQL from a MySQL dump. Load it with: psql -v ON_ERROR_STOP=1 -f <file>
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SET check_function_bodies = false;
SET client_min_messages = warning;
SET synchronous_commit = off;
SET maintenance_work_mem = '512MB';

CREATE TABLE customers (
    id bigint GENERATED BY DEFAULT AS IDENTITY NOT NULL,
    name varchar(100) NOT NULL,
    email varchar(150) NOT NULL,
    country varchar(2) DEFAULT 'US' NOT NULL,
    is_active boolean DEFAULT true NOT NULL,
    signed_up date,
    created_at timestamptz(0) DEFAULT CURRENT_TIMESTAMP NOT NULL,
    CONSTRAINT customers_id_check CHECK (id >= 0)
);

CREATE TABLE orders (
    id bigint GENERATED BY DEFAULT AS IDENTITY NOT NULL,
    customer_id bigint NOT NULL,
    status text DEFAULT 'pending' NOT NULL,
    total numeric(10,2) NOT NULL,
    items integer DEFAULT 1 NOT NULL,
    ordered_at timestamp(0) NOT NULL,
    shipped_at timestamp(0),
    note varchar(255),
    updated_at timestamptz(0) DEFAULT CURRENT_TIMESTAMP NOT NULL,
    CONSTRAINT orders_id_check CHECK (id >= 0),
    CONSTRAINT orders_customer_id_check CHECK (customer_id >= 0),
    CONSTRAINT orders_status_check CHECK (status IN ('pending', 'paid', 'shipped', 'cancelled', '')),
    CONSTRAINT orders_items_check CHECK (items >= 0)
);

COPY customers (id, name, email, country, is_active, signed_up, created_at) FROM stdin;
1	Ana Martínez	ana@example.com	MX	t	2023-01-15	2023-01-15 10:24:00+00:00
2	Zoë Müller	zoe@example.de	DE	t	2023-02-03	2023-02-03 08:11:42+00:00
3	José Peña	jose@example.es	ES	f	2023-03-21	2023-03-21 19:05:17+00:00
4	李雷	lilei@example.cn	CN	t	2023-05-09	2023-05-09 02:40:00+00:00
5	Noah O'Brien	noah@example.ie	IE	t	\N	2023-06-30 14:00:00+00:00
6	Amélie Laurent	amelie@example.fr	FR	t	2024-01-02	2024-01-02 09:30:00+00:00
7	Ravi Patel	ravi@example.in	IN	f	2024-02-29	2024-02-29 23:59:59+00:00
8	Sofia Rossi 🌻	sofia@example.it	IT	t	2024-04-12	2024-04-12 12:12:12+00:00
\.

COPY orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, updated_at) FROM stdin;
1	1	shipped	129.90	3	2024-03-01 10:00:00	2024-03-02 16:30:00	\N	2024-03-02 16:30:00+00:00
2	2	paid	54.00	1	2024-03-02 11:15:00	\N	Gift wrap 🎁	2024-03-02 11:20:00+00:00
3	1	cancelled	12.50	1	2024-03-03 09:45:00	\N	Customer changed their mind	2024-03-03 10:00:00+00:00
4	4	shipped	980.00	12	2024-03-05 02:10:00	2024-03-07 08:00:00	请小心轻放	2024-03-07 08:00:00+00:00
5	5	pending	45.75	2	2024-03-08 17:20:00	\N	Leave at the door; ring twice	2024-03-08 17:20:00+00:00
6	6	shipped	310.40	5	2024-03-10 13:00:00	2024-03-11 09:00:00	Fragile: "glass"	2024-03-11 09:00:00+00:00
7	8	paid	76.20	2	2024-03-11 18:45:00	\N	\N	2024-03-11 18:46:00+00:00
8	2		19.99	1	2024-03-12 08:00:00	\N	Status lost in an old import	2024-03-12 08:00:00+00:00
9	3	shipped	64.00	2	2024-03-14 15:30:00	\N	Shipping date never recorded	2024-03-15 10:00:00+00:00
10	7	paid	1499.00	1	2024-03-15 21:05:00	\N	C:\\Users\\ravi\\invoice.pdf	2024-03-15 21:05:00+00:00
\.


-- Keys, indexes and constraints, after the rows so each builds once.
CREATE UNIQUE INDEX customers_pkey ON customers (id);
CREATE UNIQUE INDEX customers_uq_email ON customers (email);
CREATE UNIQUE INDEX orders_pkey ON orders (id);
CREATE INDEX orders_idx_customer ON orders (customer_id);
CREATE INDEX orders_idx_status_date ON orders (status, ordered_at);
ALTER TABLE customers ADD CONSTRAINT customers_pkey PRIMARY KEY USING INDEX customers_pkey;
ALTER TABLE customers ADD CONSTRAINT customers_uq_email UNIQUE USING INDEX customers_uq_email;
ALTER TABLE orders ADD CONSTRAINT orders_pkey PRIMARY KEY USING INDEX orders_pkey;
ALTER TABLE orders ADD CONSTRAINT fk_orders_customer FOREIGN KEY (customer_id) REFERENCES customers (id) NOT VALID;
DO $f$ BEGIN
    ALTER TABLE orders VALIDATE CONSTRAINT fk_orders_customer;
EXCEPTION WHEN foreign_key_violation THEN
    RAISE WARNING 'foreign key % has rows without a parent: it stays NOT VALID, and new rows are checked', 'fk_orders_customer';
END $f$;
SELECT setval(pg_get_serial_sequence('customers', 'id'), LEAST(GREATEST(COALESCE((SELECT max(id) FROM customers)::numeric, 0) + 1, 1001), 9223372036854775807)::bigint, false);
COMMENT ON TABLE customers IS 'People who bought at least once';
SELECT setval(pg_get_serial_sequence('orders', 'id'), LEAST(GREATEST(COALESCE((SELECT max(id) FROM orders)::numeric, 0) + 1, 5001), 9223372036854775807)::bigint, false);
CREATE FUNCTION orders_updated_at_on_update() RETURNS trigger LANGUAGE plpgsql AS $f$
BEGIN
    IF NEW IS DISTINCT FROM OLD AND NEW.updated_at IS NOT DISTINCT FROM OLD.updated_at THEN
        NEW.updated_at := CURRENT_TIMESTAMP;
    END IF;
    RETURN NEW;
END
$f$;
CREATE TRIGGER orders_updated_at_on_update BEFORE UPDATE ON orders FOR EACH ROW EXECUTE FUNCTION orders_updated_at_on_update();

Düzeltmeler

  1. customers tablosunun "id" sütunu işaretsiz; bu yüzden negatif olmadığını denetleyen bir CHECK ile bigint oldu.
  2. customers tablosunun "signed_up" sütunu artık NULL kabul ediyor: bazı değerleri saklanamadı ve NULL oldu.
  3. customers tablosundaki "signed_up" sütununun varsayılan değeri 0000‑00‑00, PostgreSQL'in kabul ettiği bir tarih değil; bu yüzden sütunun varsayılan değeri yok.
  4. orders tablosunun "customer_id" sütunu işaretsiz; bu yüzden negatif olmadığını denetleyen bir CHECK ile bigint oldu.
  5. orders tablosunun "id" sütunu işaretsiz; bu yüzden negatif olmadığını denetleyen bir CHECK ile bigint oldu.
  6. orders tablosunun "items" sütunu işaretsiz; bu yüzden negatif olmadığını denetleyen bir CHECK ile integer oldu.
  7. orders tablosundaki "status" sütununun 1 satırı MySQL'in geçersiz girişler için sakladığı boş değeri içeriyor; değerleri denetleyen CHECK buna izin veriyor.
  8. orders tablosunun "updated_at" sütunu her güncellemede geçerli zamana ayarlanıyor; PostgreSQL'de bunu bir tetikleyici yapıyor.

Kontrol edilmeli

  • customers tablosunun "signed_up" sütununda 0000‑00‑00 gibi 1 sıfır veya imkansız tarih var; PostgreSQL bunları saklayamaz, bu yüzden NULL yapıldı. Bu tarihler bir anlam taşıyorsa döküm almadan önce kaynakta gerçek tarihlerle değiştirin.
  • orders tablosunun "shipped_at" sütununda 0000‑00‑00 00:00:00 gibi 1 sıfır veya imkansız tarih var; PostgreSQL bunları saklayamaz, bu yüzden NULL yapıldı. Bu tarihler bir anlam taşıyorsa döküm almadan önce kaynakta gerçek tarihlerle değiştirin.

Dosyan bu bilgisayarda dönüştürülür ve asla yüklenmez.

Diğer örnekler:

MySQL ile PostgreSQL arasında neler değişir

Her satır, dönüştürücünün uyguladığı bir kuraldır; yanında, kural verilerinizde bir şeyi değiştirdiğinde yazılan rapor satırı yer alır.

  • TINYINT(1), BOOL

    her değer 0 veya 1 ise boolean, değilse smallint

    MySQL'in BOOL türü, -128 ile 127 arasında herhangi bir sayıyı tutabilen bir TINYINT(1)'dir. Yalnızca 0 ve 1 tutan bir sütun boolean olur; 2 veya -1 tutan bir sütun sayı olarak kalır, böylece hiçbir değerin anlamı değişmez.

    Rapor satırı: bool_kept_numeric

  • UNSIGNED integers

    negatif olmadığını denetleyen bir CHECK ile bir sonraki geniş tam sayı; BIGINT UNSIGNED her değer sığıyorsa bigint, değilse numeric(20,0)

    PostgreSQL'de işaretsiz tam sayılar yoktur. Daha geniş bir tür tüm işaretsiz aralığı tutar ve CHECK, MySQL'deki gibi negatif değerleri dışarıda tutar.

    Rapor satırı: unsigned_widened

  • ZEROFILL and display widths

    kaldırılır

    Sıfır dolgusu bir sayının gösterilme biçimidir, sayının parçası değildir. Sayılar korunur; dolgu önemliyse okurken biçimlendirin.

    Rapor satırı: zerofill_dropped

  • FLOAT(M,D)

    ölçek olmadan real veya double precision

    PostgreSQL'de kayan noktalı sayıların sabit ölçeği yoktur. Saklanan değerler olduğu gibi kopyalanır.

    Rapor satırı: float_scale_dropped

  • BIT(1), BIT(n)

    boolean, bit(n)

    Tek bir bit evet veya hayırdır; daha geniş bit alanları her biti korur.

  • zero, partial or impossible dates (0000-00-00, 2024-02-30)

    NULL

    PostgreSQL yalnızca gerçek takvim tarihlerini saklar. MySQL, SQL modu izin verdiğinde sıfır ve imkansız tarihleri tutar; bunlar NULL olur ve rapor bunları sayar.

    Rapor satırı: invalid_date_null

  • NOT NULL columns with values that become NULL

    NOT NULL kaldırılır

    Değerleri NULL olmak zorunda kalan bir sütun NOT NULL kısıtını koruyamaz, yoksa yükleme durur.

    Rapor satırı: not_null_relaxed

  • DEFAULT '0000-00-00'

    varsayılan değer yok

    PostgreSQL'in saklayamadığı bir varsayılan değer, uydurma bir tarihle değiştirilmek yerine dışarıda bırakılır.

    Rapor satırı: zero_date_default

  • TIME

    her değer bir gün içindeyse time, değilse interval

    MySQL'in TIME türü -838:59:59 ile 838:59:59 arasında bir süredir. Değerleri bir güne sığan sütun günün saati olarak kalır; daha uzun veya negatif değerleri olan sütun interval olur.

    Rapor satırı: time_as_interval

  • YEAR

    aralığını denetleyen bir CHECK ile smallint

    PostgreSQL'de yıl türü yoktur; CHECK, MySQL'in izin verdiği değerlerin aynısını korur.

  • CHAR(n)

    varchar(n)

    MySQL, CHAR değerlerini okurken sondaki boşlukları kaldırır, PostgreSQL'in char(n) türü ise onları geri ekler; bu yüzden varchar(n) değerleri MySQL'in döndürdüğü gibi korur.

  • DATETIME

    timestamp

    DATETIME, PostgreSQL'in timestamp türü gibi saat dilimi olmayan bir duvar saati okumasıdır.

  • TIMESTAMP

    dökümün belirttiği saat diliminde timestamptz, belirtmiyorsa UTC

    TIMESTAMP bir andır. Dökümler değeri yazdıkları saat dilimini belirtir (mysqldump UTC yazar); bu bilgi yoksa değerler UTC olarak okunur ve rapor bunu belirtir.

    Rapor satırı: timestamp_zone_assumed

  • ENUM

    değerlerini denetleyen bir CHECK ile text

    CHECK ile text aynı değerleri korur ve bir PostgreSQL enum type ile karşılaştırıldığında değiştirmesi daha kolaydır.

  • ENUM holding '' (MySQL's error value)

    CHECK'in izin verdiği boş değer

    MySQL, esnek bir SQL modunda bir ENUM'a geçersiz bir değer girildiğinde boş bir dize saklar. Bu satırlar korunur ve CHECK onlara izin verir.

    Rapor satırı: enum_invalid_value

  • ENUM or SET holding values outside its list

    CHECK yok

    Listede adı geçmeyen değerler CHECK'ten geçemez; bu yüzden CHECK oluşturulmaz.

    Rapor satırı: enum_check_skipped

  • SET

    her öğenin listede olduğunu denetleyen bir CHECK ile text[]

    Bir dizi her öğeyi ayrı tutar; böylece sorgular üyeliği test edebilir.

  • JSON

    jsonb; bir değer \u0000 içerdiğinde json

    jsonb, PostgreSQL'in iyi indekslediği ve sorguladığı türdür, ancak \u0000 kaçış dizisini reddeder; bu yüzden onu içeren bir sütun json olarak kalır.

    Rapor satırı: json_not_jsonb

  • NUL bytes in text

    kaldırılır

    PostgreSQL metni NUL baytını tutamaz. Bayt kaldırılır ve rapor değerleri sayar.

    Rapor satırı: nul_removed

  • text that isn't valid in its character set

    hatalı baytlar yerine koyma karakteri olarak

    PostgreSQL metni geçerli UTF-8 olmalıdır.

    Rapor satırı: invalid_utf8_replaced

  • text decoded twice (ñ)

    olduğu gibi kopyalanır

    Döküm tam olarak bu karakterleri içerir, bu yüzden kopyalanırlar; rapor onları gösterir.

    Rapor satırı: mojibake_suspected

  • AUTO_INCREMENT

    sayacı kopyalanan id'lerin ötesine ayarlanmış GENERATED BY DEFAULT AS IDENTITY

    Kimlik sütunları kopyalanan id'leri kabul eder ve sayaç, en yüksek id'den veya dökümün AUTO_INCREMENT değerinden (hangisi büyükse) sonra devam eder.

  • MyISAM AUTO_INCREMENT on the second column of a key

    tablo için tek sayaç

    MyISAM, anahtarın ilk sütununun her grubu için ayrı sayar; PostgreSQL'de sütun başına tek sayaç vardır.

    Rapor satırı: myisam_group_autoincrement

  • ON UPDATE CURRENT_TIMESTAMP

    bir BEFORE UPDATE tetikleyicisi

    Tetikleyici, bir satır değiştiğinde ve güncelleme sütunu ayarlamadıysa, MySQL'deki gibi sütunu geçerli zamana ayarlar.

    Rapor satırı: on_update_trigger

  • generated columns

    STORED

    PostgreSQL 13 ile 17 arası üretilen sütunları yalnızca saklar; formül aynıdır.

    Rapor satırı: virtual_as_stored

  • generated columns with functions PostgreSQL lacks

    düz bir sütun

    PostgreSQL için yazılamayan bir formül, düz bir sütun ve bir rapor satırı bırakır.

    Rapor satırı: generated_not_translated

  • INVISIBLE columns

    normal sütunlar

    PostgreSQL'de görünmez sütunlar yoktur.

    Rapor satırı: invisible_column

  • CHECK constraints

    çevrilir, CREATE TABLE içinde satır içi

    Satır içi CHECK kısıtları, sonradan her biri için ayrı bir tarama yerine her satır yüklenirken test edilir.

  • CHECK constraints with functions PostgreSQL lacks

    oluşturulmaz

    PostgreSQL için yazılamayan bir CHECK kısıtı dışarıda bırakılır ve raporlanır.

    Rapor satırı: check_skipped

  • CHECK ... NOT ENFORCED

    oluşturulmaz

    MySQL bu CHECK kısıtlarını uygulamadan tutar, bu yüzden satırlar onları ihlal edebilir.

    Rapor satırı: check_not_enforced

  • defaults with functions PostgreSQL lacks

    varsayılan değer yok

    PostgreSQL için yazılamayan bir varsayılan değer dışarıda bırakılır ve raporlanır.

    Rapor satırı: default_not_translated

  • keys and indexes on a prefix, c(20)

    left(c, 20) üzerinde bir indeks

    PostgreSQL ifadeleri indeksler, bu yüzden aynı önek indekslenir.

    Rapor satırı: prefix_unique

  • FULLTEXT indexes

    to_tsvector('simple', ...) üzerinde GIN

    Tam metin arama MATCH ... AGAINST yerine @@ ile çalışır.

    Rapor satırı: fulltext_as_gin

  • indexes on values over 2,000 bytes

    hash

    Bir btree girdisi bu kadar uzun değerleri tutamaz; hash indeksi yine de eşit değerleri bulur.

    Rapor satırı: index_on_wide_values

  • SPATIAL indexes

    PostGIS olmadan oluşturulmaz

    Uzamsal indeksler PostGIS gerektirir.

    Rapor satırı: spatial_index_skipped

  • functional indexes PostgreSQL can't write

    oluşturulmaz

    PostgreSQL için yazılamayan bir ifade üzerindeki indeks dışarıda bırakılır ve raporlanır.

    Rapor satırı: index_skipped

  • foreign keys

    veriden sonra, NOT VALID, ardından yetim satırlar için uyarıyla doğrulanır

    Dökümler FOREIGN_KEY_CHECKS=0 ile yüklenir ve MyISAM hiç denetlemez, bu yüzden üst satırı olmayan satırlar yaygındır. Anahtar önce oluşturulur ve en son doğrulanır; yetim satırlar varsa yüklemeyi durdurmak yerine anahtar bir uyarıyla NOT VALID kalır.

  • foreign keys to columns without a unique key

    oluşturulmaz

    PostgreSQL, başvurulan sütunlarda benzersiz bir anahtar ister; InnoDB istemez.

    Rapor satırı: foreign_key_skipped

  • table and column names

    benzersiz kaldığında küçük harf

    Küçük harfli adlar PostgreSQL'de tırnaksız yazılabilir.

    Rapor satırı: identifier_renamed

  • names over 63 bytes

    bir hash ile kısaltılır

    PostgreSQL adları 63 bayt tutar; hash, kısaltılmış adları birbirinden ayırır.

    Rapor satırı: name_shortened

  • GEOMETRY, POINT, POLYGON...

    bytea içinde WKB

    PostGIS olmadan standart WKB ikili biçimi her geometriyi tam olarak korur.

    Rapor satırı: geometry_as_wkb

  • INET4, INET6, UUID (MariaDB)

    inet, uuid

    PostgreSQL'de aynı türler vardır.

  • BINARY, VARBINARY, BLOB

    bytea

    Baytlar bayt olarak kalır.

  • PARTITION BY

    tek tablo

    Satırlar aynıdır; gerekiyorsa tabloyu PostgreSQL'de yeniden bölümleyin.

    Rapor satırı: partitions_dropped

  • WITH SYSTEM VERSIONING (MariaDB)

    mevcut satırları içeren bir tablo

    Döküm yalnızca mevcut satırları içerir.

    Rapor satırı: system_versioning_dropped

  • MyISAM, MEMORY and other engines

    normal bir tablo

    PostgreSQL'in tek bir tablo motoru vardır.

    Rapor satırı: engine_dropped

  • views, triggers, procedures, functions and events

    raporda listelenir

    Kodları MySQL'in dilinde yazılmıştır, bu yüzden yeniden oluşturmanız için listelenirler.

    Rapor satırı: not_converted_objects

  • dumps without CREATE TABLE

    değerlerden okunan türler

    --no-create-info ile alınan bir dökümde yalnızca satırlar vardır, bu yüzden türler değerlerden gelir.

    Rapor satırı: no_schema

  • geometries in a dump without CREATE TABLE

    bytea içinde WKB

    MySQL'in geometri biçimi değerlerden tanınır ve standart WKB olarak saklanır.

    Rapor satırı: geometry_inferred

  • _ci collations

    tam karşılaştırma

    PostgreSQL, aksi belirtilmedikçe metni tam olarak karşılaştırır.

    Rapor satırı: case_insensitive_collation

  • SET NAMES utf8 from utf8mb4 tables

    dönüştürülür, uyarıyla

    MySQL 5.x mysqldump varsayılan olarak 3 baytlık utf8 yazar ve herhangi bir dönüştürücü dosyayı görmeden önce her emojiyi soru işaretiyle değiştirir.

    Rapor satırı: dump_lost_four_byte_chars

  • dumps without SET NAMES whose text isn't UTF-8

    Latin-1 (Windows-1252) olarak okunur

    MySQL'in latin1 kodlaması Windows-1252'dir; bu tür dökümlerin olağan kodlamasıdır.

    Rapor satırı: charset_guessed

  • sjis, cp932, gbk, big5 dumps

    uyarıyla UTF-8 olarak okunur

    Bu kodlamalar henüz çözülmüyor.

    Rapor satırı: unsupported_charset

  • UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rows

    hesaplanır

    Bazı döküm araçları değerleri bu çağrılar olarak yazar; bunlar ürettikleri değerler olarak okunur, coğrafi WKT'de boylam başa alınır.

  • other expressions in rows

    NULL

    Veritabanı çalıştırmayan bir dönüştürücü bunları hesaplayamaz.

    Rapor satırı: expression_value

  • DEFAULT in VALUES

    sütunun varsayılan değeri

    Sabit bir varsayılan değer satıra kopyalanır.

    Rapor satırı: default_keyword_filled

  • DEFAULT in VALUES without a literal default

    NULL

    Kopyalanacak bir değer yok.

    Rapor satırı: default_keyword_null

  • REPLACE and INSERT IGNORE

    düz satırlar

    Bir dökümde her anahtar için bir satır vardır, bu yüzden satırlar aynıdır.

    Rapor satırı: replace_as_insert

  • types IntoSQL doesn't know

    text

    Metin her değeri tutar; yüklemeden sonra türü değiştirin.

    Rapor satırı: unknown_type

  • values that don't fit their column

    NULL

    Hasarlı veya elle yazılmış bir döküm, sütununun tutamayacağı değerler içerebilir; geri kalanın yüklenmesi için bunlar NULL olur.

    Rapor satırı: invalid_value_null

  • unreadable geometries

    NULL

    Geometri olmayan baytlar geometri olarak saklanamaz.

    Rapor satırı: bad_geometry

  • CREATE SEQUENCE (MariaDB)

    mevcut değeriyle CREATE SEQUENCE

    PostgreSQL sequence nesneleri aynı seçenekleri alır.

MySQL içindePostgreSQL içindeRapor satırı
TINYINT(1), BOOLher değer 0 veya 1 ise boolean, değilse smallintMySQL'in BOOL türü, -128 ile 127 arasında herhangi bir sayıyı tutabilen bir TINYINT(1)'dir. Yalnızca 0 ve 1 tutan bir sütun boolean olur; 2 veya -1 tutan bir sütun sayı olarak kalır, böylece hiçbir değerin anlamı değişmez.bool_kept_numeric
UNSIGNED integersnegatif olmadığını denetleyen bir CHECK ile bir sonraki geniş tam sayı; BIGINT UNSIGNED her değer sığıyorsa bigint, değilse numeric(20,0)PostgreSQL'de işaretsiz tam sayılar yoktur. Daha geniş bir tür tüm işaretsiz aralığı tutar ve CHECK, MySQL'deki gibi negatif değerleri dışarıda tutar.unsigned_widened
ZEROFILL and display widthskaldırılırSıfır dolgusu bir sayının gösterilme biçimidir, sayının parçası değildir. Sayılar korunur; dolgu önemliyse okurken biçimlendirin.zerofill_dropped
FLOAT(M,D)ölçek olmadan real veya double precisionPostgreSQL'de kayan noktalı sayıların sabit ölçeği yoktur. Saklanan değerler olduğu gibi kopyalanır.float_scale_dropped
BIT(1), BIT(n)boolean, bit(n)Tek bir bit evet veya hayırdır; daha geniş bit alanları her biti korur.
zero, partial or impossible dates (0000-00-00, 2024-02-30)NULLPostgreSQL yalnızca gerçek takvim tarihlerini saklar. MySQL, SQL modu izin verdiğinde sıfır ve imkansız tarihleri tutar; bunlar NULL olur ve rapor bunları sayar.invalid_date_null
NOT NULL columns with values that become NULLNOT NULL kaldırılırDeğerleri NULL olmak zorunda kalan bir sütun NOT NULL kısıtını koruyamaz, yoksa yükleme durur.not_null_relaxed
DEFAULT '0000-00-00'varsayılan değer yokPostgreSQL'in saklayamadığı bir varsayılan değer, uydurma bir tarihle değiştirilmek yerine dışarıda bırakılır.zero_date_default
TIMEher değer bir gün içindeyse time, değilse intervalMySQL'in TIME türü -838:59:59 ile 838:59:59 arasında bir süredir. Değerleri bir güne sığan sütun günün saati olarak kalır; daha uzun veya negatif değerleri olan sütun interval olur.time_as_interval
YEARaralığını denetleyen bir CHECK ile smallintPostgreSQL'de yıl türü yoktur; CHECK, MySQL'in izin verdiği değerlerin aynısını korur.
CHAR(n)varchar(n)MySQL, CHAR değerlerini okurken sondaki boşlukları kaldırır, PostgreSQL'in char(n) türü ise onları geri ekler; bu yüzden varchar(n) değerleri MySQL'in döndürdüğü gibi korur.
DATETIMEtimestampDATETIME, PostgreSQL'in timestamp türü gibi saat dilimi olmayan bir duvar saati okumasıdır.
TIMESTAMPdökümün belirttiği saat diliminde timestamptz, belirtmiyorsa UTCTIMESTAMP bir andır. Dökümler değeri yazdıkları saat dilimini belirtir (mysqldump UTC yazar); bu bilgi yoksa değerler UTC olarak okunur ve rapor bunu belirtir.timestamp_zone_assumed
ENUMdeğerlerini denetleyen bir CHECK ile textCHECK ile text aynı değerleri korur ve bir PostgreSQL enum type ile karşılaştırıldığında değiştirmesi daha kolaydır.
ENUM holding '' (MySQL's error value)CHECK'in izin verdiği boş değerMySQL, esnek bir SQL modunda bir ENUM'a geçersiz bir değer girildiğinde boş bir dize saklar. Bu satırlar korunur ve CHECK onlara izin verir.enum_invalid_value
ENUM or SET holding values outside its listCHECK yokListede adı geçmeyen değerler CHECK'ten geçemez; bu yüzden CHECK oluşturulmaz.enum_check_skipped
SETher öğenin listede olduğunu denetleyen bir CHECK ile text[]Bir dizi her öğeyi ayrı tutar; böylece sorgular üyeliği test edebilir.
JSONjsonb; bir değer \u0000 içerdiğinde jsonjsonb, PostgreSQL'in iyi indekslediği ve sorguladığı türdür, ancak \u0000 kaçış dizisini reddeder; bu yüzden onu içeren bir sütun json olarak kalır.json_not_jsonb
NUL bytes in textkaldırılırPostgreSQL metni NUL baytını tutamaz. Bayt kaldırılır ve rapor değerleri sayar.nul_removed
text that isn't valid in its character sethatalı baytlar yerine koyma karakteri olarakPostgreSQL metni geçerli UTF-8 olmalıdır.invalid_utf8_replaced
text decoded twice (ñ)olduğu gibi kopyalanırDöküm tam olarak bu karakterleri içerir, bu yüzden kopyalanırlar; rapor onları gösterir.mojibake_suspected
AUTO_INCREMENTsayacı kopyalanan id'lerin ötesine ayarlanmış GENERATED BY DEFAULT AS IDENTITYKimlik sütunları kopyalanan id'leri kabul eder ve sayaç, en yüksek id'den veya dökümün AUTO_INCREMENT değerinden (hangisi büyükse) sonra devam eder.
MyISAM AUTO_INCREMENT on the second column of a keytablo için tek sayaçMyISAM, anahtarın ilk sütununun her grubu için ayrı sayar; PostgreSQL'de sütun başına tek sayaç vardır.myisam_group_autoincrement
ON UPDATE CURRENT_TIMESTAMPbir BEFORE UPDATE tetikleyicisiTetikleyici, bir satır değiştiğinde ve güncelleme sütunu ayarlamadıysa, MySQL'deki gibi sütunu geçerli zamana ayarlar.on_update_trigger
generated columnsSTOREDPostgreSQL 13 ile 17 arası üretilen sütunları yalnızca saklar; formül aynıdır.virtual_as_stored
generated columns with functions PostgreSQL lacksdüz bir sütunPostgreSQL için yazılamayan bir formül, düz bir sütun ve bir rapor satırı bırakır.generated_not_translated
INVISIBLE columnsnormal sütunlarPostgreSQL'de görünmez sütunlar yoktur.invisible_column
CHECK constraintsçevrilir, CREATE TABLE içinde satır içiSatır içi CHECK kısıtları, sonradan her biri için ayrı bir tarama yerine her satır yüklenirken test edilir.
CHECK constraints with functions PostgreSQL lacksoluşturulmazPostgreSQL için yazılamayan bir CHECK kısıtı dışarıda bırakılır ve raporlanır.check_skipped
CHECK ... NOT ENFORCEDoluşturulmazMySQL bu CHECK kısıtlarını uygulamadan tutar, bu yüzden satırlar onları ihlal edebilir.check_not_enforced
defaults with functions PostgreSQL lacksvarsayılan değer yokPostgreSQL için yazılamayan bir varsayılan değer dışarıda bırakılır ve raporlanır.default_not_translated
keys and indexes on a prefix, c(20)left(c, 20) üzerinde bir indeksPostgreSQL ifadeleri indeksler, bu yüzden aynı önek indekslenir.prefix_unique
FULLTEXT indexesto_tsvector('simple', ...) üzerinde GINTam metin arama MATCH ... AGAINST yerine @@ ile çalışır.fulltext_as_gin
indexes on values over 2,000 byteshashBir btree girdisi bu kadar uzun değerleri tutamaz; hash indeksi yine de eşit değerleri bulur.index_on_wide_values
SPATIAL indexesPostGIS olmadan oluşturulmazUzamsal indeksler PostGIS gerektirir.spatial_index_skipped
functional indexes PostgreSQL can't writeoluşturulmazPostgreSQL için yazılamayan bir ifade üzerindeki indeks dışarıda bırakılır ve raporlanır.index_skipped
foreign keysveriden sonra, NOT VALID, ardından yetim satırlar için uyarıyla doğrulanırDökümler FOREIGN_KEY_CHECKS=0 ile yüklenir ve MyISAM hiç denetlemez, bu yüzden üst satırı olmayan satırlar yaygındır. Anahtar önce oluşturulur ve en son doğrulanır; yetim satırlar varsa yüklemeyi durdurmak yerine anahtar bir uyarıyla NOT VALID kalır.
foreign keys to columns without a unique keyoluşturulmazPostgreSQL, başvurulan sütunlarda benzersiz bir anahtar ister; InnoDB istemez.foreign_key_skipped
table and column namesbenzersiz kaldığında küçük harfKüçük harfli adlar PostgreSQL'de tırnaksız yazılabilir.identifier_renamed
names over 63 bytesbir hash ile kısaltılırPostgreSQL adları 63 bayt tutar; hash, kısaltılmış adları birbirinden ayırır.name_shortened
GEOMETRY, POINT, POLYGON...bytea içinde WKBPostGIS olmadan standart WKB ikili biçimi her geometriyi tam olarak korur.geometry_as_wkb
INET4, INET6, UUID (MariaDB)inet, uuidPostgreSQL'de aynı türler vardır.
BINARY, VARBINARY, BLOBbyteaBaytlar bayt olarak kalır.
PARTITION BYtek tabloSatırlar aynıdır; gerekiyorsa tabloyu PostgreSQL'de yeniden bölümleyin.partitions_dropped
WITH SYSTEM VERSIONING (MariaDB)mevcut satırları içeren bir tabloDöküm yalnızca mevcut satırları içerir.system_versioning_dropped
MyISAM, MEMORY and other enginesnormal bir tabloPostgreSQL'in tek bir tablo motoru vardır.engine_dropped
views, triggers, procedures, functions and eventsraporda listelenirKodları MySQL'in dilinde yazılmıştır, bu yüzden yeniden oluşturmanız için listelenirler.not_converted_objects
dumps without CREATE TABLEdeğerlerden okunan türler--no-create-info ile alınan bir dökümde yalnızca satırlar vardır, bu yüzden türler değerlerden gelir.no_schema
geometries in a dump without CREATE TABLEbytea içinde WKBMySQL'in geometri biçimi değerlerden tanınır ve standart WKB olarak saklanır.geometry_inferred
_ci collationstam karşılaştırmaPostgreSQL, aksi belirtilmedikçe metni tam olarak karşılaştırır.case_insensitive_collation
SET NAMES utf8 from utf8mb4 tablesdönüştürülür, uyarıylaMySQL 5.x mysqldump varsayılan olarak 3 baytlık utf8 yazar ve herhangi bir dönüştürücü dosyayı görmeden önce her emojiyi soru işaretiyle değiştirir.dump_lost_four_byte_chars
dumps without SET NAMES whose text isn't UTF-8Latin-1 (Windows-1252) olarak okunurMySQL'in latin1 kodlaması Windows-1252'dir; bu tür dökümlerin olağan kodlamasıdır.charset_guessed
sjis, cp932, gbk, big5 dumpsuyarıyla UTF-8 olarak okunurBu kodlamalar henüz çözülmüyor.unsupported_charset
UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rowshesaplanırBazı döküm araçları değerleri bu çağrılar olarak yazar; bunlar ürettikleri değerler olarak okunur, coğrafi WKT'de boylam başa alınır.
other expressions in rowsNULLVeritabanı çalıştırmayan bir dönüştürücü bunları hesaplayamaz.expression_value
DEFAULT in VALUESsütunun varsayılan değeriSabit bir varsayılan değer satıra kopyalanır.default_keyword_filled
DEFAULT in VALUES without a literal defaultNULLKopyalanacak bir değer yok.default_keyword_null
REPLACE and INSERT IGNOREdüz satırlarBir dökümde her anahtar için bir satır vardır, bu yüzden satırlar aynıdır.replace_as_insert
types IntoSQL doesn't knowtextMetin her değeri tutar; yüklemeden sonra türü değiştirin.unknown_type
values that don't fit their columnNULLHasarlı veya elle yazılmış bir döküm, sütununun tutamayacağı değerler içerebilir; geri kalanın yüklenmesi için bunlar NULL olur.invalid_value_null
unreadable geometriesNULLGeometri olmayan baytlar geometri olarak saklanamaz.bad_geometry
CREATE SEQUENCE (MariaDB)mevcut değeriyle CREATE SEQUENCEPostgreSQL sequence nesneleri aynı seçenekleri alır.

Betiği PostgreSQL veritabanına yükleyin

Betik tabloları oluşturur, satırları kopyalar, ardından anahtarları, indeksleri ve yabancı anahtarları ekler; böylece hızlı yüklenir ve ilk hatada durur.

psql -v ON_ERROR_STOP=1 -d mydb -f mysql.postgresql.sql

Yabancı anahtarlar NOT VALID olarak eklenir ve ardından doğrulanır. Bir satır var olmayan bir satıra işaret ediyorsa betik, yarı yolda başarısız olmak yerine hangi kısıtın sorunlu olduğunu söyler.

Büyük bir döküm için önce veritabanını oluşturun ve betiği sunucuyla aynı makinede psql ile çalıştırın.

En iyi sonuç için MySQL dökümü nasıl alınır

Dönüştürücü, dökümün içerdiğini okur. Bu seçenekler verilerinizin daha fazlasını dökümde tutar:

  • --default-character-set=utf8mb4 emoji ve diğer 4 baytlık karakterleri korur; utf8 dökümü bunları dönüştürücü görmeden önce kaybeder.
  • --hex-blob ikili sütunları onaltılık olarak yazar; bu biçim sistemler arasında kopyalamada bozulmaz.
  • --routines --triggers --events bu nesneleri döküme ekler; böylece rapor onları listeleyebilir.

Neler dönüştürülmez

Görünümler, tetikleyiciler, saklı yordamlar, fonksiyonlar ve olaylar her veritabanının kendi dilinde yazılır. Raporda adlarıyla listelenirler, asla sessizce atlanmazlar; böylece onları PostgreSQL için yeniden yazabilirsiniz.

pgloader ile karşılaştırmalı ölçüm

Aynı dökümler, Ekim 2026'da tek bir makinede (SATA SSD'li 10 çekirdekli bir i9-10900K) IntoSQL ve pgloader 3.6.7 ile dönüştürüldü ve yüklendi.

  • 2, -1 ve -5 içeren bir TINYINT(1) sütunu: pgloader her biri için uyarı vermeden true yükler. IntoSQL sayıları korur ve rapor nedenini söyler.
  • Varsayılan değeri 'it's' olan bir sütun, adında ters tırnak geçen bir tablo, boş değer içeren bir ENUM ve 24 saati aşan bir TIME içeren bir döküm: pgloader durur. IntoSQL dökümü dönüştürür ve yükler.
  • pgloader'ın yüklediği veride birincil, benzersiz ve yabancı anahtarlar ile kimlik sütunları kaybolmuştur. IntoSQL hepsini korur.
  • 30 milyon satırlık 5.3 GB'lık bir döküm: pgloader önce dökümün çalışan bir MySQL'e geri yüklenmesini ister, bu 18 dakika sürer, ardından varsayılan ayarlarıyla belleği tükenir. IntoSQL dökümü 10 saniyede dönüştürür, psql de betiği yaklaşık 3 dakikada yükler.
  • MySQL 5.5 ile 9 ve MariaDB 10.3 ile 12 arasından 476 döküm, PostgreSQL 13 ve 18'e yüklendi: hiç yükleme hatası yok ve hiçbir değer raporda bir satır olmadan değişmedi.

MySQL - PostgreSQL dönüştürme hakkında sorular

Yanıtınızı bulamadınız mı? İletişim sayfasından bize yazın, bir kişi yanıt verir. İletişim sayfası

Dökümüm yükleniyor mu?

Hayır. Dönüştürücü tarayıcınızda çalışır ve dökümü diskinizden parça parça okur; böylece döküm bilgisayarınızdan hiç çıkmaz. Masaüstü uygulaması ve komut satırı da bilgisayarınızda dönüştürür.

Döküm ne kadar büyük olabilir?

Dönüştürücü dökümün tamamını asla bellekte tutmaz: dosyayı aralıklar halinde iki kez okur ve betiği ilerledikçe yazar. Birkaç gigabaytlık dökümler tarayıcıda, masaüstü uygulamasında ve komut satırıyla dönüştürülür.

MariaDB dökümlerini okuyor mu?

Evet. mariadb-dump ile alınan dökümler ve MariaDB 10.3 ile 12 arası sürümlerin dökümleri, MariaDB'nin INET6, INET4 ve UUID sütunları dahil, aynı şekilde dönüştürülür.

0000-00-00 tarihlerine ne olur?

PostgreSQL içinde sıfır tarih yoktur; bu yüzden bunlar NULL olur ve sütun NULL kabul eder. Rapor her sütunda kaç tane olduğunu söyler.

AUTO_INCREMENT değerleri korunuyor mu?

Evet. Her AUTO_INCREMENT sütunu bir kimlik sütunu olur, her satır kendi id'sini korur ve sonraki id en yüksek id'den sonra devam eder; tablonun AUTO_INCREMENT değeri daha yüksekse ondan sonra.

TINYINT(1) boolean olur mu?

Yalnızca sütundaki her değer 0 veya 1 ise. 2 veya -1 gibi başka sayılar içeriyorsa sayı olarak kalır ve rapor nedenini söyler; böylece hiçbir değer yanlışlıkla true olmaz.

Saklı yordamlar ve tetikleyiciler ne olur?

Raporda adlarıyla listelenirler ve dönüştürülmezler, çünkü her veritabanı onları kendi dilinde yazar. ON UPDATE CURRENT_TIMESTAMP istisnadır: bir PostgreSQL tetikleyicisine dönüşür.

Betik hangi PostgreSQL sürümlerinde yüklenir?

PostgreSQL 13 ile 18 arası. Aynı betik her birinde yüklenir ve bir sorun çıkarsa ilk hatada durur.