Konversi MySQL ke SQL Server
Letakkan dump dari mysqldump, mariadb-dump, mysqlpump, phpMyAdmin, atau Adminer, sebagai .sql atau .sql.gz, lalu unduh skrip SQL Server dengan tabel, kunci, indeks, dan data yang sama. Setiap nilai yang tidak bisa disimpan SQL Server apa adanya, dan setiap objek yang tidak didukungnya, dicantumkan di laporan.
18 baris dikonversi, 10 perbaikan, tidak ada yang ditolak
Tabel di shop_2024.sqlDump MySQL 8.0.46 · ditulis oleh mysqldump · utf8mb4
customers8 baris4
7 kolom id bigint not null name nvarchar(200) not null email nvarchar(150) not null country nvarchar(2) not null is_active bit not null signed_up date created_at datetimeoffset(0) not null orders10 baris6
9 kolom id bigint not null customer_id bigint not null status nvarchar(9) not null total decimal(10,2) not null items int not null ordered_at datetime2(0) not null shipped_at datetime2(0) note nvarchar(510) updated_at datetimeoffset(0) not null
-- Written by IntoSQL from a MySQL dump. Load it with: sqlcmd -b -f 65001 -d <database> -i <file>
SET NOCOUNT ON;
SET ANSI_NULLS ON;
SET QUOTED_IDENTIFIER ON;
SET ANSI_PADDING ON;
SET ANSI_WARNINGS ON;
SET ARITHABORT ON;
SET CONCAT_NULL_YIELDS_NULL ON;
SET NUMERIC_ROUNDABORT OFF;
GO
CREATE TABLE [dbo].[customers] (
[id] bigint IDENTITY(1001, 1) NOT NULL,
[name] nvarchar(200) NOT NULL,
[email] nvarchar(150) NOT NULL,
[country] nvarchar(2) DEFAULT N'US' NOT NULL,
[is_active] bit DEFAULT 1 NOT NULL,
[signed_up] date NULL,
[created_at] datetimeoffset(0) DEFAULT SYSDATETIMEOFFSET() NOT NULL,
CONSTRAINT [CK_customers_id] CHECK ([id] >= 0),
CONSTRAINT [PK_customers] PRIMARY KEY ([id])
);
GO
CREATE TABLE [dbo].[orders] (
[id] bigint IDENTITY(5001, 1) NOT NULL,
[customer_id] bigint NOT NULL,
[status] nvarchar(9) DEFAULT N'pending' NOT NULL,
[total] decimal(10,2) NOT NULL,
[items] int DEFAULT 1 NOT NULL,
[ordered_at] datetime2(0) NOT NULL,
[shipped_at] datetime2(0) NULL,
[note] nvarchar(510) NULL,
[updated_at] datetimeoffset(0) DEFAULT SYSDATETIMEOFFSET() NOT NULL,
CONSTRAINT [CK_orders_id] CHECK ([id] >= 0),
CONSTRAINT [CK_orders_customer_id] CHECK ([customer_id] >= 0),
CONSTRAINT [CK_orders_status] CHECK ([status] IN (N'pending', N'paid', N'shipped', N'cancelled', N'')),
CONSTRAINT [CK_orders_items] CHECK ([items] >= 0),
CONSTRAINT [PK_orders] PRIMARY KEY ([id])
);
GO
SET IDENTITY_INSERT [dbo].[customers] ON;
INSERT INTO [dbo].[customers] ([id], [name], [email], [country], [is_active], [signed_up], [created_at]) VALUES
(1,N'Ana Martínez',N'ana@example.com',N'MX',1,'2023-01-15','2023-01-15 10:24:00+00:00'),
(2,N'Zoë Müller',N'zoe@example.de',N'DE',1,'2023-02-03','2023-02-03 08:11:42+00:00'),
(3,N'José Peña',N'jose@example.es',N'ES',0,'2023-03-21','2023-03-21 19:05:17+00:00'),
(4,N'李雷',N'lilei@example.cn',N'CN',1,'2023-05-09','2023-05-09 02:40:00+00:00'),
(5,N'Noah O''Brien',N'noah@example.ie',N'IE',1,NULL,'2023-06-30 14:00:00+00:00'),
(6,N'Amélie Laurent',N'amelie@example.fr',N'FR',1,'2024-01-02','2024-01-02 09:30:00+00:00'),
(7,N'Ravi Patel',N'ravi@example.in',N'IN',0,'2024-02-29','2024-02-29 23:59:59+00:00'),
(8,N'Sofia Rossi 🌻',N'sofia@example.it',N'IT',1,'2024-04-12','2024-04-12 12:12:12+00:00');
SET IDENTITY_INSERT [dbo].[customers] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [updated_at]) VALUES
(1,1,N'shipped',129.90,3,'2024-03-01 10:00:00','2024-03-02 16:30:00',NULL,'2024-03-02 16:30:00+00:00'),
(2,2,N'paid',54.00,1,'2024-03-02 11:15:00',NULL,N'Gift wrap 🎁','2024-03-02 11:20:00+00:00'),
(3,1,N'cancelled',12.50,1,'2024-03-03 09:45:00',NULL,N'Customer changed their mind','2024-03-03 10:00:00+00:00'),
(4,4,N'shipped',980.00,12,'2024-03-05 02:10:00','2024-03-07 08:00:00',N'请小心轻放','2024-03-07 08:00:00+00:00'),
(5,5,N'pending',45.75,2,'2024-03-08 17:20:00',NULL,N'Leave at the door; ring twice','2024-03-08 17:20:00+00:00'),
(6,6,N'shipped',310.40,5,'2024-03-10 13:00:00','2024-03-11 09:00:00',N'Fragile: "glass"','2024-03-11 09:00:00+00:00'),
(7,8,N'paid',76.20,2,'2024-03-11 18:45:00',NULL,NULL,'2024-03-11 18:46:00+00:00'),
(8,2,N'',19.99,1,'2024-03-12 08:00:00',NULL,N'Status lost in an old import','2024-03-12 08:00:00+00:00'),
(9,3,N'shipped',64.00,2,'2024-03-14 15:30:00',NULL,N'Shipping date never recorded','2024-03-15 10:00:00+00:00'),
(10,7,N'paid',1499.00,1,'2024-03-15 21:05:00',NULL,N'C:\Users\ravi\invoice.pdf','2024-03-15 21:05:00+00:00');
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO
-- Indexes, foreign keys, counters and triggers, after the rows.
CREATE UNIQUE INDEX [uq_email] ON [dbo].[customers] ([email]);
CREATE INDEX [idx_customer] ON [dbo].[orders] ([customer_id]);
CREATE INDEX [idx_status_date] ON [dbo].[orders] ([status], [ordered_at]);
ALTER TABLE [dbo].[orders] WITH NOCHECK ADD CONSTRAINT [fk_orders_customer] FOREIGN KEY ([customer_id]) REFERENCES [dbo].[customers] ([id]);
BEGIN TRY ALTER TABLE [dbo].[orders] WITH CHECK CHECK CONSTRAINT [fk_orders_customer]; END TRY BEGIN CATCH PRINT N'Foreign key ' + N'[fk_orders_customer]' + N' has rows without a parent: it stays unchecked, and new rows are checked.'; END CATCH;
DECLARE @next decimal(38,0) = (SELECT MAX([id]) FROM [dbo].[customers]); IF @next IS NOT NULL BEGIN IF @next < 1000 SET @next = 1000; DBCC CHECKIDENT (N'[dbo].[customers]', RESEED, @next) WITH NO_INFOMSGS; END;
GO
EXEC sys.sp_addextendedproperty @name = N'MS_Description', @value = N'People who bought at least once', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = N'customers';
DECLARE @next decimal(38,0) = (SELECT MAX([id]) FROM [dbo].[orders]); IF @next IS NOT NULL BEGIN IF @next < 5000 SET @next = 5000; DBCC CHECKIDENT (N'[dbo].[orders]', RESEED, @next) WITH NO_INFOMSGS; END;
GO
GO
CREATE TRIGGER [dbo].[TR_orders_updated_at_on_update] ON [dbo].[orders] AFTER UPDATE AS
BEGIN
SET NOCOUNT ON;
IF NOT UPDATE([updated_at])
UPDATE x SET [updated_at] = SYSDATETIMEOFFSET() FROM [dbo].[orders] AS x JOIN inserted AS i ON x.[id] = i.[id];
END;
GO
GO
Perbaikan
- "id" dari customers bersifat unsigned, jadi menjadi bigint dengan CHECK bahwa nilainya tidak negatif.
- "name" di customers berisi karakter yang dihitung dua kali oleh SQL Server, seperti emoji, jadi menjadi nvarchar(200).
- "signed_up" dari customers kini mengizinkan NULL: sebagian nilainya tidak bisa disimpan dan menjadi NULL.
- Default "signed_up" di customers, 0000‑00‑00, bukan tanggal yang diterima SQL Server, jadi kolom itu tanpa default.
- "customer_id" dari orders bersifat unsigned, jadi menjadi bigint dengan CHECK bahwa nilainya tidak negatif.
- "id" dari orders bersifat unsigned, jadi menjadi bigint dengan CHECK bahwa nilainya tidak negatif.
- "items" dari orders bersifat unsigned, jadi menjadi int dengan CHECK bahwa nilainya tidak negatif.
- "note" di orders berisi karakter yang dihitung dua kali oleh SQL Server, seperti emoji, jadi menjadi nvarchar(510).
- 1 baris dari "status" di orders berisi nilai kosong yang disimpan MySQL untuk entri tidak valid; CHECK untuk nilainya mengizinkannya.
- "updated_at" dari orders berubah ke waktu saat ini di setiap pembaruan; di SQL Server, trigger yang melakukannya.
Perlu diperiksa
- 1 nilai di "signed_up" dari customers adalah tanggal nol atau mustahil, misalnya 0000‑00‑00, yang tidak bisa disimpan SQL Server, jadi menjadi NULL. Jika tanggal itu bermakna, ganti di sumber dengan tanggal sungguhan sebelum membuat dump.
- 1 nilai di "shipped_at" dari orders adalah tanggal nol atau mustahil, misalnya 0000‑00‑00 00:00:00, yang tidak bisa disimpan SQL Server, jadi menjadi NULL. Jika tanggal itu bermakna, ganti di sumber dengan tanggal sungguhan sebelum membuat dump.
File Anda dikonversi di komputer ini dan tidak pernah diunggah.
Contoh lain:
Yang berubah dari MySQL ke SQL Server
Setiap baris adalah aturan yang diterapkan konverter, beserta baris laporan yang ditulisnya saat aturan itu mengubah sesuatu di data Anda.
TINYINT(1), BOOL
bit jika setiap nilai 0 atau 1, selain itu smallint
BOOL di MySQL adalah TINYINT(1) yang bisa berisi angka apa pun dari -128 sampai 127. Kolom yang hanya berisi 0 dan 1 menjadi bit; kolom yang berisi 2 atau -1 tetap berupa angka agar tidak ada nilai yang berubah makna.
Baris laporan: bool_kept_numeric
UNSIGNED integers
TINYINT UNSIGNED menjadi tinyint; lainnya bilangan bulat yang lebih lebar dengan CHECK bahwa nilainya tidak negatif, BIGINT UNSIGNED menjadi bigint jika semua nilai muat, selain itu decimal(38,0)
SQL Server tidak punya bilangan bulat unsigned kecuali tinyint, yang bernilai 0 sampai 255. Tipe yang lebih lebar memuat seluruh rentang unsigned, dan CHECK mencegah nilai negatif seperti di MySQL.
Baris laporan: unsigned_widened
ZEROFILL and display widths
dihapus
Isian nol adalah cara menampilkan angka, bukan bagian dari angka. Angkanya dipertahankan; format saat dibaca jika isian itu penting.
Baris laporan: zerofill_dropped
FLOAT(M,D)
real atau float, tanpa skala
Bilangan floating-point SQL Server tidak punya skala tetap. Nilai yang tersimpan disalin apa adanya.
Baris laporan: float_scale_dropped
DECIMAL(p,s)
decimal(p,s) sampai 38 digit; nvarchar jika lebih
decimal di SQL Server memuat 38 digit. Desimal yang lebih lebar disimpan sebagai teks agar setiap digit tetap tepat.
Baris laporan: decimal_as_text
BIT(1), BIT(n)
bit; bigint sampai 63 bit; decimal(20,0) untuk BIT(64)
Satu bit berarti ya atau tidak; field bit yang lebih lebar disimpan sebagai angka yang dibentuk bit-bitnya.
zero, partial or impossible dates (0000-00-00, 2024-02-30)
NULL
SQL Server hanya menyimpan tanggal kalender yang nyata. MySQL menyimpan tanggal nol dan mustahil jika mode SQL-nya mengizinkan; tanggal itu menjadi NULL dan laporan menghitungnya.
Baris laporan: invalid_date_null
NOT NULL columns with values that become NULL
NOT NULL dihapus
Kolom yang nilainya harus menjadi NULL tidak bisa mempertahankan NOT NULL, atau pemuatan akan berhenti.
Baris laporan: not_null_relaxed
DEFAULT '0000-00-00'
tanpa default
Default yang tidak bisa disimpan SQL Server dihilangkan, bukan diganti dengan tanggal karangan.
Baris laporan: zero_date_default
TIME
time jika setiap nilai dalam sehari, selain itu nvarchar
TIME di MySQL adalah durasi dari -838:59:59 sampai 838:59:59; time di SQL Server adalah jam dalam sehari. Kolom dengan nilai lebih panjang atau negatif menyimpannya sebagai teks.
Baris laporan: time_as_interval
YEAR
smallint dengan CHECK rentangnya
SQL Server tidak punya tipe tahun; CHECK mempertahankan nilai yang sama dengan yang diizinkan MySQL.
CHAR(n), VARCHAR(n)
nvarchar(n)
nvarchar memuat setiap karakter di setiap versi yang didukung, dan MySQL mengembalikan nilai CHAR tanpa spasi di akhir, sebagaimana nvarchar menyimpannya.
text with characters past U+FFFF (emoji) in VARCHAR(n)
nvarchar(2n), atau nvarchar(max) jika lebih dari 4000
nvarchar menghitung unit UTF-16 dan satu emoji memakai dua, jadi kolomnya diberi ruang untuk setiap nilai.
Baris laporan: text_length_widened
DATETIME
datetime2
DATETIME adalah pembacaan jam dinding tanpa zona waktu, seperti datetime2.
TIMESTAMP
datetimeoffset dalam zona waktu yang disebutkan dump, UTC jika tidak disebutkan
TIMESTAMP adalah satu momen. Dump menyebutkan zona tempat nilainya ditulis (mysqldump menulis UTC); tanpa itu, nilainya dibaca sebagai UTC dan laporan menyebutkannya.
Baris laporan: timestamp_zone_assumed
ENUM
nvarchar dengan CHECK nilainya
Text dengan CHECK mempertahankan nilai yang sama.
ENUM holding '' (MySQL's error value)
nilai kosong yang diizinkan CHECK
MySQL menyimpan string kosong saat nilai tidak valid masuk ke ENUM dalam mode SQL yang longgar. Baris itu dipertahankan dan CHECK mengizinkannya.
Baris laporan: enum_invalid_value
ENUM holding values outside its list
tanpa CHECK
Nilai yang tidak ada di daftar akan gagal di CHECK, jadi CHECK tidak dibuat.
Baris laporan: enum_check_skipped
SET
nvarchar seperti yang ditulis MySQL ('a,b')
SQL Server tidak punya array; teksnya sama dengan yang dikembalikan MySQL.
JSON
nvarchar(max)
Fungsi JSON SQL Server membaca JSON dari teks. CHECK ISJSON akan menolak nilai skalar seperti 1 atau "x" sebelum SQL Server 2022, padahal MySQL menyimpannya.
NUL bytes in text
dipertahankan
nvarchar bisa memuat karakter NUL, jadi nilainya disalin apa adanya.
text that isn't valid in its character set
byte yang rusak menjadi karakter pengganti
Teks harus dibaca sebagai karakter agar bisa ditulis sebagai nvarchar.
Baris laporan: invalid_utf8_replaced
text decoded twice (ñ)
disalin apa adanya
Dump berisi persis karakter ini, jadi karakter itu disalin; laporan menunjukkannya.
Baris laporan: mojibake_suspected
AUTO_INCREMENT
IDENTITY, dengan penghitung diatur melewati id yang disalin
Id yang disalin dimuat dengan IDENTITY_INSERT, dan penghitung berlanjut setelah id tertinggi atau AUTO_INCREMENT dari dump, mana yang lebih tinggi.
MyISAM AUTO_INCREMENT on the second column of a key
satu penghitung untuk tabel
MyISAM menghitung per grup kolom pertama kunci; SQL Server punya satu penghitung per tabel.
Baris laporan: myisam_group_autoincrement
ON UPDATE CURRENT_TIMESTAMP
trigger AFTER UPDATE
Trigger mengatur kolom ke waktu saat ini ketika pembaruan tidak mengaturnya. Trigger melakukan join pada primary key, jadi tabel memerlukannya.
Baris laporan: on_update_trigger
ON UPDATE CURRENT_TIMESTAMP on a table without a primary key
tidak dibawa
Trigger menemukan baris yang diperbarui lewat primary key-nya; tanpa itu, trigger tidak bisa.
Baris laporan: on_update_without_key
generated columns
kolom computed, PERSISTED jika sumber menyimpannya
SQL Server menghitungnya dengan dua cara yang sama.
generated columns with functions SQL Server lacks
kolom biasa
Rumus yang tidak bisa ditulis untuk SQL Server menyisakan kolom biasa dan satu baris laporan.
Baris laporan: generated_not_translated
INVISIBLE columns
kolom biasa
SQL Server tidak punya kolom yang tidak terlihat.
Baris laporan: invisible_column
CHECK constraints
diterjemahkan, langsung di CREATE TABLE
CHECK di dalam tabel diuji saat setiap baris dimuat.
CHECK constraints with functions SQL Server lacks
tidak dibuat
CHECK yang tidak bisa ditulis untuk SQL Server dihilangkan dan dilaporkan.
Baris laporan: check_skipped
CHECK ... NOT ENFORCED
tidak dibuat
MySQL menyimpan CHECK ini tanpa menerapkannya, jadi baris bisa melanggarnya.
Baris laporan: check_not_enforced
defaults with functions SQL Server lacks
tanpa default
Default yang tidak bisa ditulis untuk SQL Server dihilangkan dan dilaporkan.
Baris laporan: default_not_translated
keys and indexes on a prefix, c(20)
indeks pada seluruh kolom
SQL Server mengindeks seluruh kolom; kunci yang unik pada prefiks juga unik pada seluruh kolom, jadi setiap baris dimuat.
Baris laporan: prefix_whole_column
FULLTEXT indexes
tidak dibuat
Pencarian teks lengkap SQL Server memerlukan katalog dan kueri sendiri.
Baris laporan: fulltext_not_created
SPATIAL indexes
tidak dibuat
Indeks spasial pada kolom geometry memerlukan bounding box yang tidak disebutkan dump.
Baris laporan: spatial_index_not_created
functional indexes, and indexes on columns of unlimited length
tidak dibuat
SQL Server tidak mengindeks ekspresi maupun kolom nvarchar(max) dan varbinary(max).
Baris laporan: index_skipped
foreign keys
setelah data WITH NOCHECK, lalu diperiksa dengan peringatan untuk baris yatim
Dump dimuat dengan FOREIGN_KEY_CHECKS=0 dan MyISAM tidak pernah memeriksa, jadi baris tanpa induk umum ditemukan. Key dibuat lebih dulu dan diperiksa terakhir; baris yatim membuatnya tetap tidak diperiksa dengan peringatan, bukan menghentikan pemuatan.
ON DELETE or ON UPDATE that cascades in a cycle or along a second path
NO ACTION
SQL Server menolak cascade yang bisa mencapai satu tabel dua kali; MySQL mengizinkannya.
Baris laporan: foreign_key_action_dropped
foreign keys to columns without a unique key
tidak dibuat
SQL Server memerlukan primary key atau indeks unik tanpa NULL pada kolom yang dirujuk; InnoDB tidak.
Baris laporan: foreign_key_skipped
table and column names
seperti ditulis; diganti nama jika hanya berbeda huruf besar-kecil
Nama di SQL Server tidak membedakan huruf besar-kecil dengan collation yang biasa.
Baris laporan: identifier_renamed
names over 116 characters
dipersingkat
Nama di SQL Server memuat 128 karakter, sebagian untuk angka yang membedakan nama.
Baris laporan: name_shortened
GEOMETRY, POINT, POLYGON...
geometry, dengan SRID setiap nilai
Tipe geometry milik SQL Server mempertahankan setiap bentuk dan sistem referensi spasialnya.
INET4, INET6, UUID (MariaDB)
nvarchar(39), uniqueidentifier
uniqueidentifier adalah UUID di SQL Server; alamat disimpan sebagai teks.
BINARY, VARBINARY, BLOB
binary, varbinary, varbinary(max)
Byte tetap byte.
PARTITION BY
satu tabel
Barisnya sama; partisi ulang tabel di SQL Server jika diperlukan.
Baris laporan: partitions_dropped
WITH SYSTEM VERSIONING (MariaDB)
tabel dengan baris saat ini
Dump hanya berisi baris saat ini.
Baris laporan: system_versioning_dropped
MyISAM, MEMORY and other engines
tabel biasa
SQL Server punya satu engine tabel.
Baris laporan: engine_dropped
views, triggers, procedures, functions and events
dicantumkan di laporan
Kodenya ditulis dalam bahasa MySQL, jadi dicantumkan agar Anda bisa membuatnya ulang.
Baris laporan: not_converted_objects
dumps without CREATE TABLE
tipe dibaca dari nilai
Dump yang dibuat dengan --no-create-info hanya berisi baris, jadi tipenya diambil dari nilai.
Baris laporan: no_schema
geometries in a dump without CREATE TABLE
geometry
Format geometri MySQL dikenali dari nilainya.
_ci collations
collation database, biasanya tidak membedakan huruf besar-kecil
SQL Server membandingkan teks tanpa membedakan huruf besar-kecil dengan collation yang biasa, seperti _ci di MySQL.
SET NAMES utf8 from utf8mb4 tables
dikonversi, dengan peringatan
mysqldump di MySQL 5.x secara default menulis utf8 3 byte dan mengganti setiap emoji dengan tanda tanya sebelum konverter mana pun melihat file itu.
Baris laporan: dump_lost_four_byte_chars
dumps without SET NAMES whose text isn't UTF-8
dibaca sebagai Latin-1 (Windows-1252)
latin1 di MySQL adalah Windows-1252, pengodean yang biasa dipakai dump semacam itu.
Baris laporan: charset_guessed
sjis, cp932, gbk, big5 dumps
dibaca sebagai UTF-8, dengan peringatan
Pengodean ini belum didekode.
Baris laporan: unsupported_charset
UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rows
dievaluasi
Beberapa alat dump menulis nilai sebagai panggilan ini; panggilan itu dibaca sebagai nilai yang dihasilkannya, dengan WKT geografis diubah agar longitude lebih dulu.
other expressions in rows
NULL
Konverter yang tidak menjalankan database tidak bisa mengevaluasinya.
Baris laporan: expression_value
DEFAULT in VALUES
nilai default kolom
Default literal disalin ke baris.
Baris laporan: default_keyword_filled
DEFAULT in VALUES without a literal default
NULL
Tidak ada nilai untuk disalin.
Baris laporan: default_keyword_null
REPLACE and INSERT IGNORE
baris biasa
Dump punya satu baris per kunci, jadi barisnya sama.
Baris laporan: replace_as_insert
types IntoSQL doesn't know
nvarchar(max)
Text memuat nilai apa pun; ubah tipenya setelah pemuatan.
Baris laporan: unknown_type
values that don't fit their column
NULL
Dump yang rusak atau ditulis manual bisa berisi nilai yang tidak muat di kolomnya; nilai itu menjadi NULL agar sisanya tetap dimuat.
Baris laporan: invalid_value_null
unreadable geometries
NULL
Byte yang bukan geometri tidak bisa disimpan sebagai geometri.
Baris laporan: bad_geometry
CREATE SEQUENCE (MariaDB)
CREATE SEQUENCE ... AS bigint, dengan nilai berikutnya
SQL Server punya sequence dengan opsi yang sama; masing-masing berlanjut dari posisi terakhir di dump.
VECTOR(n) (MariaDB 11.7+)
nvarchar(max) dengan float sebagai array JSON
Hanya SQL Server 2025 yang punya tipe vektor; array JSON mempertahankan setiap float di setiap versi.
Baris laporan: type_replaced
| Di MySQL | Di SQL Server | Baris laporan |
|---|---|---|
| TINYINT(1), BOOL | bit jika setiap nilai 0 atau 1, selain itu smallintBOOL di MySQL adalah TINYINT(1) yang bisa berisi angka apa pun dari -128 sampai 127. Kolom yang hanya berisi 0 dan 1 menjadi bit; kolom yang berisi 2 atau -1 tetap berupa angka agar tidak ada nilai yang berubah makna. | bool_kept_numeric |
| UNSIGNED integers | TINYINT UNSIGNED menjadi tinyint; lainnya bilangan bulat yang lebih lebar dengan CHECK bahwa nilainya tidak negatif, BIGINT UNSIGNED menjadi bigint jika semua nilai muat, selain itu decimal(38,0)SQL Server tidak punya bilangan bulat unsigned kecuali tinyint, yang bernilai 0 sampai 255. Tipe yang lebih lebar memuat seluruh rentang unsigned, dan CHECK mencegah nilai negatif seperti di MySQL. | unsigned_widened |
| ZEROFILL and display widths | dihapusIsian nol adalah cara menampilkan angka, bukan bagian dari angka. Angkanya dipertahankan; format saat dibaca jika isian itu penting. | zerofill_dropped |
| FLOAT(M,D) | real atau float, tanpa skalaBilangan floating-point SQL Server tidak punya skala tetap. Nilai yang tersimpan disalin apa adanya. | float_scale_dropped |
| DECIMAL(p,s) | decimal(p,s) sampai 38 digit; nvarchar jika lebihdecimal di SQL Server memuat 38 digit. Desimal yang lebih lebar disimpan sebagai teks agar setiap digit tetap tepat. | decimal_as_text |
| BIT(1), BIT(n) | bit; bigint sampai 63 bit; decimal(20,0) untuk BIT(64)Satu bit berarti ya atau tidak; field bit yang lebih lebar disimpan sebagai angka yang dibentuk bit-bitnya. | |
| zero, partial or impossible dates (0000-00-00, 2024-02-30) | NULLSQL Server hanya menyimpan tanggal kalender yang nyata. MySQL menyimpan tanggal nol dan mustahil jika mode SQL-nya mengizinkan; tanggal itu menjadi NULL dan laporan menghitungnya. | invalid_date_null |
| NOT NULL columns with values that become NULL | NOT NULL dihapusKolom yang nilainya harus menjadi NULL tidak bisa mempertahankan NOT NULL, atau pemuatan akan berhenti. | not_null_relaxed |
| DEFAULT '0000-00-00' | tanpa defaultDefault yang tidak bisa disimpan SQL Server dihilangkan, bukan diganti dengan tanggal karangan. | zero_date_default |
| TIME | time jika setiap nilai dalam sehari, selain itu nvarcharTIME di MySQL adalah durasi dari -838:59:59 sampai 838:59:59; time di SQL Server adalah jam dalam sehari. Kolom dengan nilai lebih panjang atau negatif menyimpannya sebagai teks. | time_as_interval |
| YEAR | smallint dengan CHECK rentangnyaSQL Server tidak punya tipe tahun; CHECK mempertahankan nilai yang sama dengan yang diizinkan MySQL. | |
| CHAR(n), VARCHAR(n) | nvarchar(n)nvarchar memuat setiap karakter di setiap versi yang didukung, dan MySQL mengembalikan nilai CHAR tanpa spasi di akhir, sebagaimana nvarchar menyimpannya. | |
| text with characters past U+FFFF (emoji) in VARCHAR(n) | nvarchar(2n), atau nvarchar(max) jika lebih dari 4000nvarchar menghitung unit UTF-16 dan satu emoji memakai dua, jadi kolomnya diberi ruang untuk setiap nilai. | text_length_widened |
| DATETIME | datetime2DATETIME adalah pembacaan jam dinding tanpa zona waktu, seperti datetime2. | |
| TIMESTAMP | datetimeoffset dalam zona waktu yang disebutkan dump, UTC jika tidak disebutkanTIMESTAMP adalah satu momen. Dump menyebutkan zona tempat nilainya ditulis (mysqldump menulis UTC); tanpa itu, nilainya dibaca sebagai UTC dan laporan menyebutkannya. | timestamp_zone_assumed |
| ENUM | nvarchar dengan CHECK nilainyaText dengan CHECK mempertahankan nilai yang sama. | |
| ENUM holding '' (MySQL's error value) | nilai kosong yang diizinkan CHECKMySQL menyimpan string kosong saat nilai tidak valid masuk ke ENUM dalam mode SQL yang longgar. Baris itu dipertahankan dan CHECK mengizinkannya. | enum_invalid_value |
| ENUM holding values outside its list | tanpa CHECKNilai yang tidak ada di daftar akan gagal di CHECK, jadi CHECK tidak dibuat. | enum_check_skipped |
| SET | nvarchar seperti yang ditulis MySQL ('a,b')SQL Server tidak punya array; teksnya sama dengan yang dikembalikan MySQL. | |
| JSON | nvarchar(max)Fungsi JSON SQL Server membaca JSON dari teks. CHECK ISJSON akan menolak nilai skalar seperti 1 atau "x" sebelum SQL Server 2022, padahal MySQL menyimpannya. | |
| NUL bytes in text | dipertahankannvarchar bisa memuat karakter NUL, jadi nilainya disalin apa adanya. | |
| text that isn't valid in its character set | byte yang rusak menjadi karakter penggantiTeks harus dibaca sebagai karakter agar bisa ditulis sebagai nvarchar. | invalid_utf8_replaced |
| text decoded twice (ñ) | disalin apa adanyaDump berisi persis karakter ini, jadi karakter itu disalin; laporan menunjukkannya. | mojibake_suspected |
| AUTO_INCREMENT | IDENTITY, dengan penghitung diatur melewati id yang disalinId yang disalin dimuat dengan IDENTITY_INSERT, dan penghitung berlanjut setelah id tertinggi atau AUTO_INCREMENT dari dump, mana yang lebih tinggi. | |
| MyISAM AUTO_INCREMENT on the second column of a key | satu penghitung untuk tabelMyISAM menghitung per grup kolom pertama kunci; SQL Server punya satu penghitung per tabel. | myisam_group_autoincrement |
| ON UPDATE CURRENT_TIMESTAMP | trigger AFTER UPDATETrigger mengatur kolom ke waktu saat ini ketika pembaruan tidak mengaturnya. Trigger melakukan join pada primary key, jadi tabel memerlukannya. | on_update_trigger |
| ON UPDATE CURRENT_TIMESTAMP on a table without a primary key | tidak dibawaTrigger menemukan baris yang diperbarui lewat primary key-nya; tanpa itu, trigger tidak bisa. | on_update_without_key |
| generated columns | kolom computed, PERSISTED jika sumber menyimpannyaSQL Server menghitungnya dengan dua cara yang sama. | |
| generated columns with functions SQL Server lacks | kolom biasaRumus yang tidak bisa ditulis untuk SQL Server menyisakan kolom biasa dan satu baris laporan. | generated_not_translated |
| INVISIBLE columns | kolom biasaSQL Server tidak punya kolom yang tidak terlihat. | invisible_column |
| CHECK constraints | diterjemahkan, langsung di CREATE TABLECHECK di dalam tabel diuji saat setiap baris dimuat. | |
| CHECK constraints with functions SQL Server lacks | tidak dibuatCHECK yang tidak bisa ditulis untuk SQL Server dihilangkan dan dilaporkan. | check_skipped |
| CHECK ... NOT ENFORCED | tidak dibuatMySQL menyimpan CHECK ini tanpa menerapkannya, jadi baris bisa melanggarnya. | check_not_enforced |
| defaults with functions SQL Server lacks | tanpa defaultDefault yang tidak bisa ditulis untuk SQL Server dihilangkan dan dilaporkan. | default_not_translated |
| keys and indexes on a prefix, c(20) | indeks pada seluruh kolomSQL Server mengindeks seluruh kolom; kunci yang unik pada prefiks juga unik pada seluruh kolom, jadi setiap baris dimuat. | prefix_whole_column |
| FULLTEXT indexes | tidak dibuatPencarian teks lengkap SQL Server memerlukan katalog dan kueri sendiri. | fulltext_not_created |
| SPATIAL indexes | tidak dibuatIndeks spasial pada kolom geometry memerlukan bounding box yang tidak disebutkan dump. | spatial_index_not_created |
| functional indexes, and indexes on columns of unlimited length | tidak dibuatSQL Server tidak mengindeks ekspresi maupun kolom nvarchar(max) dan varbinary(max). | index_skipped |
| foreign keys | setelah data WITH NOCHECK, lalu diperiksa dengan peringatan untuk baris yatimDump dimuat dengan FOREIGN_KEY_CHECKS=0 dan MyISAM tidak pernah memeriksa, jadi baris tanpa induk umum ditemukan. Key dibuat lebih dulu dan diperiksa terakhir; baris yatim membuatnya tetap tidak diperiksa dengan peringatan, bukan menghentikan pemuatan. | |
| ON DELETE or ON UPDATE that cascades in a cycle or along a second path | NO ACTIONSQL Server menolak cascade yang bisa mencapai satu tabel dua kali; MySQL mengizinkannya. | foreign_key_action_dropped |
| foreign keys to columns without a unique key | tidak dibuatSQL Server memerlukan primary key atau indeks unik tanpa NULL pada kolom yang dirujuk; InnoDB tidak. | foreign_key_skipped |
| table and column names | seperti ditulis; diganti nama jika hanya berbeda huruf besar-kecilNama di SQL Server tidak membedakan huruf besar-kecil dengan collation yang biasa. | identifier_renamed |
| names over 116 characters | dipersingkatNama di SQL Server memuat 128 karakter, sebagian untuk angka yang membedakan nama. | name_shortened |
| GEOMETRY, POINT, POLYGON... | geometry, dengan SRID setiap nilaiTipe geometry milik SQL Server mempertahankan setiap bentuk dan sistem referensi spasialnya. | |
| INET4, INET6, UUID (MariaDB) | nvarchar(39), uniqueidentifieruniqueidentifier adalah UUID di SQL Server; alamat disimpan sebagai teks. | |
| BINARY, VARBINARY, BLOB | binary, varbinary, varbinary(max)Byte tetap byte. | |
| PARTITION BY | satu tabelBarisnya sama; partisi ulang tabel di SQL Server jika diperlukan. | partitions_dropped |
| WITH SYSTEM VERSIONING (MariaDB) | tabel dengan baris saat iniDump hanya berisi baris saat ini. | system_versioning_dropped |
| MyISAM, MEMORY and other engines | tabel biasaSQL Server punya satu engine tabel. | engine_dropped |
| views, triggers, procedures, functions and events | dicantumkan di laporanKodenya ditulis dalam bahasa MySQL, jadi dicantumkan agar Anda bisa membuatnya ulang. | not_converted_objects |
| dumps without CREATE TABLE | tipe dibaca dari nilaiDump yang dibuat dengan --no-create-info hanya berisi baris, jadi tipenya diambil dari nilai. | no_schema |
| geometries in a dump without CREATE TABLE | geometryFormat geometri MySQL dikenali dari nilainya. | |
| _ci collations | collation database, biasanya tidak membedakan huruf besar-kecilSQL Server membandingkan teks tanpa membedakan huruf besar-kecil dengan collation yang biasa, seperti _ci di MySQL. | |
| SET NAMES utf8 from utf8mb4 tables | dikonversi, dengan peringatanmysqldump di MySQL 5.x secara default menulis utf8 3 byte dan mengganti setiap emoji dengan tanda tanya sebelum konverter mana pun melihat file itu. | dump_lost_four_byte_chars |
| dumps without SET NAMES whose text isn't UTF-8 | dibaca sebagai Latin-1 (Windows-1252)latin1 di MySQL adalah Windows-1252, pengodean yang biasa dipakai dump semacam itu. | charset_guessed |
| sjis, cp932, gbk, big5 dumps | dibaca sebagai UTF-8, dengan peringatanPengodean ini belum didekode. | unsupported_charset |
| UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rows | dievaluasiBeberapa alat dump menulis nilai sebagai panggilan ini; panggilan itu dibaca sebagai nilai yang dihasilkannya, dengan WKT geografis diubah agar longitude lebih dulu. | |
| other expressions in rows | NULLKonverter yang tidak menjalankan database tidak bisa mengevaluasinya. | expression_value |
| DEFAULT in VALUES | nilai default kolomDefault literal disalin ke baris. | default_keyword_filled |
| DEFAULT in VALUES without a literal default | NULLTidak ada nilai untuk disalin. | default_keyword_null |
| REPLACE and INSERT IGNORE | baris biasaDump punya satu baris per kunci, jadi barisnya sama. | replace_as_insert |
| types IntoSQL doesn't know | nvarchar(max)Text memuat nilai apa pun; ubah tipenya setelah pemuatan. | unknown_type |
| values that don't fit their column | NULLDump yang rusak atau ditulis manual bisa berisi nilai yang tidak muat di kolomnya; nilai itu menjadi NULL agar sisanya tetap dimuat. | invalid_value_null |
| unreadable geometries | NULLByte yang bukan geometri tidak bisa disimpan sebagai geometri. | bad_geometry |
| CREATE SEQUENCE (MariaDB) | CREATE SEQUENCE ... AS bigint, dengan nilai berikutnyaSQL Server punya sequence dengan opsi yang sama; masing-masing berlanjut dari posisi terakhir di dump. | |
| VECTOR(n) (MariaDB 11.7+) | nvarchar(max) dengan float sebagai array JSONHanya SQL Server 2025 yang punya tipe vektor; array JSON mempertahankan setiap float di setiap versi. | type_replaced |
Muat skrip ke SQL Server
Skrip membuat tabel, menyalin baris, lalu menambahkan kunci, indeks, dan foreign key, jadi pemuatan berjalan cepat dan berhenti di galat pertama.
sqlcmd -b -f 65001 -S localhost -d mydb -i mysql.sql_server.sqlForeign key ditambahkan WITH NOCHECK lalu diperiksa. Jika sebuah baris merujuk ke baris yang tidak ada, skrip menyebutkan constraint mana dan membiarkannya tidak diperiksa, bukan gagal di tengah jalan.
Untuk dump yang besar, jalankan sqlcmd di mesin yang sama dengan server. Setiap batch berisi maksimal 1000 baris di-commit sendiri, jadi log transaksi tetap kecil.
Buat dump MySQL untuk hasil terbaik
Konverter membaca apa yang ada di dump. Opsi berikut membuat lebih banyak data Anda tetap ada di dalamnya:
- --default-character-set=utf8mb4 mempertahankan emoji dan karakter 4 byte lainnya, yang hilang di dump utf8 sebelum konverter melihatnya.
- --hex-blob menulis kolom biner sebagai heksadesimal, yang tetap utuh saat disalin antarsistem.
- --routines --triggers --events menambahkan objek-objek itu ke dump, sehingga laporan bisa mencantumkannya.
Yang tidak dikonversi
View, trigger, stored procedure, fungsi, dan event ditulis dalam bahasa masing-masing database. Semuanya dicantumkan di laporan berdasarkan nama, tidak pernah dibuang diam-diam, sehingga Anda bisa menulis ulang untuk SQL Server.
Pertanyaan tentang MySQL ke SQL Server
Tidak terjawab di sini? Tulis ke kami dari halaman kontak, dan seseorang akan membalas. Halaman kontak
Apakah dump saya diunggah?
Tidak. Konverter berjalan di browser Anda dan membaca dump dari disk Anda sepotong demi sepotong, jadi dump tidak pernah meninggalkan komputer Anda. Aplikasi desktop dan command line juga mengonversi di komputer Anda.
Seberapa besar dump yang bisa dipakai?
Konverter tidak pernah menyimpan seluruh dump di memori: file dibaca dua kali, per rentang, dan skrip ditulis sambil berjalan. Dump berukuran beberapa gigabyte bisa dikonversi di browser, di aplikasi desktop, dan dengan command line.
Apakah dump MariaDB bisa dibaca?
Ya. Dump dari mariadb-dump dan dari MariaDB 10.3 sampai 12 dikonversi dengan cara yang sama, termasuk kolom INET6, INET4, dan UUID milik MariaDB.
Apa yang terjadi pada tanggal 0000-00-00?
SQL Server tidak punya tanggal nol, jadi tanggal itu menjadi NULL dan kolomnya menerima NULL. Laporan menyebutkan jumlahnya di setiap kolom.
Apakah nilai AUTO_INCREMENT dipertahankan?
Ya. Setiap kolom AUTO_INCREMENT menjadi kolom IDENTITY, setiap baris mempertahankan id-nya, dan id berikutnya berlanjut setelah id tertinggi, atau setelah AUTO_INCREMENT tabel jika itu lebih tinggi.
Apakah TINYINT(1) menjadi boolean?
Menjadi bit hanya jika setiap nilai di kolom itu 0 atau 1. Jika berisi angka lain, seperti 2 atau -1, kolom tetap berupa angka dan laporan menjelaskan alasannya, jadi tidak ada nilai yang tanpa sengaja menjadi 1.
Bagaimana dengan stored procedure dan trigger?
Semuanya dicantumkan di laporan berdasarkan nama dan tidak dikonversi, karena setiap database menulisnya dalam bahasanya sendiri. ON UPDATE CURRENT_TIMESTAMP adalah pengecualian: menjadi trigger SQL Server.
Di versi SQL Server mana skrip bisa dimuat?
SQL Server 2017 sampai 2025. Skrip yang sama dimuat di setiap versi itu, dan berhenti di galat pertama jika ada yang salah.