Converti MariaDB in SQL Server
Trascina un dump di mariadb-dump, mysqldump, phpMyAdmin o Adminer, in .sql o .sql.gz, e scarica uno script SQL Server con le stesse tabelle, chiavi, indici e dati. Ogni valore che SQL Server non può contenere così com'è, e ogni oggetto che non supporta, è elencato nel report.
18 righe convertite, 10 correzioni, nessuna rifiutata
Tabelle in shop_2024_mariadb.sqlDump MariaDB 11.8.9-MariaDB-ubu2404 · scritto da mariadb-dump · utf8mb4
customers8 righe4
8 colonne 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 last_ip nvarchar(39) orders10 righe6
12 colonne 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) order_ref uniqueidentifier not null invoice int not null details nvarchar(max) 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 SEQUENCE [dbo].[invoice_numbers] AS bigint START WITH 2000 INCREMENT BY 1 MINVALUE 1 MAXVALUE 9223372036854775806;
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,
[last_ip] nvarchar(39) 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,
[order_ref] uniqueidentifier NOT NULL,
[invoice] int DEFAULT (NEXT VALUE FOR [dbo].[invoice_numbers]) NOT NULL,
[details] nvarchar(max) 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], [last_ip]) VALUES
(1,N'Ana Martínez',N'ana@example.com',N'MX',1,'2023-01-15','2023-01-15 10:24:00+00:00',N'::ffff:203.0.113.7'),
(2,N'Zoë Müller',N'zoe@example.de',N'DE',1,'2023-02-03','2023-02-03 08:11:42+00:00',N'2001:db8::1'),
(3,N'José Peña',N'jose@example.es',N'ES',0,'2023-03-21','2023-03-21 19:05:17+00:00',NULL),
(4,N'李雷',N'lilei@example.cn',N'CN',1,'2023-05-09','2023-05-09 02:40:00+00:00',N'::ffff:198.51.100.23'),
(5,N'Noah O''Brien',N'noah@example.ie',N'IE',1,NULL,'2023-06-30 14:00:00+00:00',NULL),
(6,N'Amélie Laurent',N'amelie@example.fr',N'FR',1,'2024-01-02','2024-01-02 09:30:00+00:00',N'2001:db8:85a3::8a2e:370:7334'),
(7,N'Ravi Patel',N'ravi@example.in',N'IN',0,'2024-02-29','2024-02-29 23:59:59+00:00',N'::ffff:192.0.2.200'),
(8,N'Sofia Rossi 🌻',N'sofia@example.it',N'IT',1,'2024-04-12','2024-04-12 12:12:12+00:00',NULL);
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], [order_ref], [invoice], [details], [updated_at]) VALUES
(1,1,N'shipped',129.90,3,'2024-03-01 10:00:00','2024-03-02 16:30:00',NULL,N'0b7a4c2e-3f1d-4e8a-9c55-1a2b3c4d5e6f',1000,N'{"gift": false}','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 🎁',N'1c8b5d3f-4a2e-4f9b-8d66-2b3c4d5e6f70',1001,N'{"gift": true, "wrap": "red"}','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',N'2d9c6e4a-5b3f-4a0c-9e77-3c4d5e6f7081',1002,NULL,'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'请小心轻放',N'3e0d7f5b-6c4a-4b1d-8f88-4d5e6f708192',1003,N'{"fragile": true}','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',N'4f1e806c-7d5b-4c2e-9a99-5e6f708192a3',1004,NULL,'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"',N'50f2917d-8e6c-4d3f-8baa-6f708192a3b4',1005,N'{"fragile": true}','2024-03-11 09:00:00+00:00'),
(7,8,N'paid',76.20,2,'2024-03-11 18:45:00',NULL,NULL,N'6103a28e-9f7d-4e40-9cbb-708192a3b4c5',1006,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',N'7214b39f-a08e-4f51-8dcc-8192a3b4c5d6',1007,NULL,'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',N'8325c4a0-b19f-4062-9edd-92a3b4c5d6e7',1008,N'{"parcels": [1, 2]}','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',N'9436d5b1-c2a0-4173-8fee-a3b4c5d6e7f8',1009,NULL,'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
Correzioni
- "id" di customers è senza segno, quindi è diventata bigint con un vincolo CHECK che non sia negativa.
- "name" di customers contiene caratteri che SQL Server conta due volte, come le emoji, quindi è nvarchar(200).
- "signed_up" di customers ora ammette NULL: alcuni dei suoi valori non si potevano salvare e sono NULL.
- Il valore predefinito di "signed_up" in customers, 0000‑00‑00, non è una data che SQL Server accetta, quindi la colonna non ha un valore predefinito.
- "customer_id" di orders è senza segno, quindi è diventata bigint con un vincolo CHECK che non sia negativa.
- "id" di orders è senza segno, quindi è diventata bigint con un vincolo CHECK che non sia negativa.
- "items" di orders è senza segno, quindi è diventata int con un vincolo CHECK che non sia negativa.
- "note" di orders contiene caratteri che SQL Server conta due volte, come le emoji, quindi è nvarchar(510).
- 1 riga di "status" in orders contiene il valore vuoto che MySQL salva per le voci non valide; il vincolo CHECK sui suoi valori lo ammette.
- "updated_at" di orders passa all'ora corrente a ogni aggiornamento; in SQL Server lo fa un trigger.
Da controllare
- 1 valore in "signed_up" di customers è una data zero o impossibile come 0000‑00‑00, che SQL Server non può salvare, quindi è NULL. Se quelle date hanno un significato, sostituiscile nell'origine con date reali prima del dump.
- 1 valore in "shipped_at" di orders è una data zero o impossibile come 0000‑00‑00 00:00:00, che SQL Server non può salvare, quindi è NULL. Se quelle date hanno un significato, sostituiscile nell'origine con date reali prima del dump.
Il tuo file viene convertito su questo computer e non viene mai caricato.
Altri esempi:
Cosa cambia da MariaDB a SQL Server
Ogni riga è una regola che il convertitore applica, con la riga del report che scrive quando la regola cambia qualcosa nei tuoi dati.
TINYINT(1), BOOL
bit quando ogni valore è 0 o 1, altrimenti smallint
Il BOOL di MySQL è un TINYINT(1) che può contenere qualsiasi numero da -128 a 127. Una colonna che contiene solo 0 e 1 diventa bit; una che contiene 2 o -1 resta un numero, così nessun valore cambia significato.
Riga del report: bool_kept_numeric
UNSIGNED integers
TINYINT UNSIGNED come tinyint; gli altri come l'intero più ampio successivo con un CHECK che non sia negativo, BIGINT UNSIGNED come bigint quando ogni valore ci sta, altrimenti decimal(38,0)
SQL Server non ha interi senza segno tranne tinyint, che va da 0 a 255. Un tipo più ampio contiene tutto l'intervallo senza segno, e il vincolo CHECK tiene fuori i valori negativi come faceva MySQL.
Riga del report: unsigned_widened
ZEROFILL and display widths
rimosso
Il riempimento con zeri è un modo di mostrare un numero, non ne fa parte. I numeri restano; formattali quando li leggi se il riempimento conta.
Riga del report: zerofill_dropped
FLOAT(M,D)
real o float, senza la scala
I float di SQL Server non hanno una scala fissa. I valori salvati vengono copiati così come sono.
Riga del report: float_scale_dropped
DECIMAL(p,s)
decimal(p,s) fino a 38 cifre; nvarchar oltre
Il decimal di SQL Server contiene 38 cifre. I decimali più ampi restano come testo, così ogni cifra resta esatta.
Riga del report: decimal_as_text
BIT(1), BIT(n)
bit; bigint fino a 63 bit; decimal(20,0) per BIT(64)
Un singolo bit è un sì o un no; i campi di bit più ampi vengono salvati come il numero formato dai loro bit.
zero, partial or impossible dates (0000-00-00, 2024-02-30)
NULL
SQL Server salva solo date reali del calendario. MySQL conserva date zero e impossibili quando la sua modalità SQL lo consente; diventano NULL e il report le conta.
Riga del report: invalid_date_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
DEFAULT '0000-00-00'
nessun valore predefinito
Un valore predefinito che SQL Server non può salvare viene omesso invece di essere sostituito con una data inventata.
Riga del report: zero_date_default
TIME
time quando ogni valore sta in un giorno, altrimenti nvarchar
Il TIME di MySQL è una durata da -838:59:59 a 838:59:59; il time di SQL Server è un'ora del giorno. Una colonna con valori più lunghi o negativi li mantiene come testo.
Riga del report: time_as_interval
YEAR
smallint con un CHECK del suo intervallo
SQL Server non ha un tipo anno; il vincolo CHECK mantiene gli stessi valori che MySQL consente.
CHAR(n), VARCHAR(n)
nvarchar(n)
nvarchar contiene ogni carattere su ogni versione supportata, e MySQL restituisce i valori CHAR senza spazi finali, come li mantiene nvarchar.
text with characters past U+FFFF (emoji) in VARCHAR(n)
nvarchar(2n), o nvarchar(max) oltre 4000
nvarchar conta unità UTF-16 e un'emoji ne occupa due, quindi la colonna ha spazio per ogni valore.
Riga del report: text_length_widened
DATETIME
datetime2
Un DATETIME è l'ora letta su un orologio, senza fuso orario, come datetime2.
TIMESTAMP
datetimeoffset nel fuso orario indicato dal dump, UTC se non ne indica uno
Un TIMESTAMP è un istante. I dump indicano il fuso in cui lo hanno scritto (mysqldump scrive UTC); senza questa indicazione, i valori vengono letti come UTC e il report lo dice.
Riga del report: timestamp_zone_assumed
ENUM
nvarchar con un CHECK dei suoi valori
Il testo con un vincolo CHECK mantiene gli stessi valori.
ENUM holding '' (MySQL's error value)
il valore vuoto ammesso dal vincolo CHECK
MySQL salva una stringa vuota quando un valore non valido entra in un ENUM con una modalità SQL permissiva. Quelle righe restano e il vincolo CHECK le ammette.
Riga del report: enum_invalid_value
ENUM holding values outside its list
nessun CHECK
I valori che la lista non nomina violerebbero il vincolo CHECK, quindi il vincolo non viene creato.
Riga del report: enum_check_skipped
SET
nvarchar come lo scrive MySQL ('a,b')
SQL Server non ha array; il testo è quello che restituisce MySQL.
JSON
nvarchar(max)
Le funzioni JSON di SQL Server leggono il JSON dal testo. Un CHECK con ISJSON rifiuterebbe prima di SQL Server 2022 valori scalari come 1 o "x", che MySQL mantiene.
NUL bytes in text
mantenuto
nvarchar può contenere un carattere NUL, quindi il valore viene copiato così com'è.
text that isn't valid in its character set
i byte errati come carattere di sostituzione
Il testo va letto come caratteri per essere scritto come nvarchar.
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
AUTO_INCREMENT
IDENTITY, con il contatore impostato oltre gli id copiati
Gli id copiati si caricano con IDENTITY_INSERT, e il contatore riparte dopo il più alto o dopo l'AUTO_INCREMENT del dump, se è maggiore.
MyISAM AUTO_INCREMENT on the second column of a key
un solo contatore per la tabella
MyISAM conta per gruppo della prima colonna della chiave; SQL Server ha un contatore per tabella.
Riga del report: myisam_group_autoincrement
ON UPDATE CURRENT_TIMESTAMP
un trigger AFTER UPDATE
Il trigger imposta la colonna all'ora corrente quando un aggiornamento non la imposta. Fa il join sulla chiave primaria, quindi la tabella ne deve avere una.
Riga del report: on_update_trigger
ON UPDATE CURRENT_TIMESTAMP on a table without a primary key
non riportato
Il trigger trova le righe aggiornate tramite la chiave primaria; senza, non può.
Riga del report: on_update_without_key
generated columns
colonne calcolate, PERSISTED quando la sorgente le salva
SQL Server le calcola negli stessi due modi.
generated columns with functions SQL Server lacks
una colonna semplice
Una formula che non si può scrivere per SQL Server lascia una colonna semplice e una riga nel report.
Riga del report: generated_not_translated
INVISIBLE columns
colonne normali
SQL Server non ha colonne invisibili.
Riga del report: invisible_column
CHECK constraints
tradotti, dentro CREATE TABLE
I CHECK nella tabella si verificano mentre ogni riga si carica.
CHECK constraints with functions SQL Server lacks
non creato
Un vincolo CHECK che non si può scrivere per SQL Server viene omesso e segnalato.
Riga del report: check_skipped
CHECK ... NOT ENFORCED
non creati
MySQL conserva questi vincoli senza applicarli, quindi le righe possono violarli.
Riga del report: check_not_enforced
defaults with functions SQL Server lacks
nessun valore predefinito
Un valore predefinito che non si può scrivere per SQL Server viene omesso e segnalato.
Riga del report: default_not_translated
keys and indexes on a prefix, c(20)
un indice sull'intera colonna
SQL Server indicizza colonne intere; una chiave univoca su un prefisso è univoca anche sull'intera colonna, quindi ogni riga si carica.
Riga del report: prefix_whole_column
FULLTEXT indexes
non creato
La ricerca full-text di SQL Server richiede un catalogo e query proprie.
Riga del report: fulltext_not_created
SPATIAL indexes
non creato
Un indice spaziale su una colonna geometry richiede un riquadro di delimitazione che il dump non indica.
Riga del report: spatial_index_not_created
functional indexes, and indexes on columns of unlimited length
non creato
SQL Server non indicizza né le espressioni né le colonne nvarchar(max) e varbinary(max).
Riga del report: index_skipped
foreign keys
dopo i dati WITH NOCHECK, poi controllata con un avviso sulle righe orfane
I dump si caricano con FOREIGN_KEY_CHECKS=0 e MyISAM non controlla mai, quindi le righe senza un genitore sono comuni. La chiave viene creata per prima e controllata per ultima; le righe orfane la lasciano non controllata con un avviso invece di fermare il caricamento.
ON DELETE or ON UPDATE that cascades in a cycle or along a second path
NO ACTION
SQL Server rifiuta le cascate che potrebbero raggiungere una tabella due volte; MySQL le consente.
Riga del report: foreign_key_action_dropped
foreign keys to columns without a unique key
non creata
SQL Server richiede una chiave primaria o un indice univoco senza NULL sulle colonne referenziate; InnoDB no.
Riga del report: foreign_key_skipped
table and column names
come scritti; rinominati quando differiscono solo per maiuscole
In SQL Server i nomi ignorano le maiuscole con la collation abituale.
Riga del report: identifier_renamed
names over 116 characters
accorciato
In SQL Server i nomi arrivano a 128 caratteri, alcuni dei quali per i numeri che tengono distinti i nomi.
Riga del report: name_shortened
GEOMETRY, POINT, POLYGON...
geometry, con lo SRID di ogni valore
Il tipo geometry di SQL Server mantiene ogni forma e il suo sistema di riferimento spaziale.
INET4, INET6, UUID (MariaDB)
nvarchar(39), uniqueidentifier
uniqueidentifier è l'UUID di SQL Server; gli indirizzi restano come testo.
BINARY, VARBINARY, BLOB
binary, varbinary, varbinary(max)
I byte restano byte.
PARTITION BY
una sola tabella
Le righe sono le stesse; partiziona di nuovo la tabella in SQL Server se serve.
Riga del report: partitions_dropped
WITH SYSTEM VERSIONING (MariaDB)
una tabella con le righe attuali
Un dump contiene solo le righe attuali.
Riga del report: system_versioning_dropped
MyISAM, MEMORY and other engines
una tabella normale
SQL Server ha un solo motore di tabelle.
Riga del report: engine_dropped
views, triggers, procedures, functions and events
elencati nel report
Il loro codice è scritto nel linguaggio di MySQL, quindi vengono elencati perché tu li ricrei.
Riga del report: not_converted_objects
dumps without CREATE TABLE
tipi ricavati dai valori
Un dump fatto con --no-create-info contiene solo righe, quindi i tipi vengono dai valori.
Riga del report: no_schema
geometries in a dump without CREATE TABLE
geometry
Il formato delle geometrie di MySQL viene riconosciuto dai valori.
_ci collations
la collation del database, di solito case-insensitive
SQL Server confronta il testo ignorando le maiuscole con la sua collation abituale, come fa il _ci di MySQL.
SET NAMES utf8 from utf8mb4 tables
convertito, con un avviso
mysqldump di MySQL 5.x scrive utf8 a 3 byte per impostazione predefinita e sostituisce ogni emoji con un punto interrogativo prima che un convertitore veda il file.
Riga del report: dump_lost_four_byte_chars
dumps without SET NAMES whose text isn't UTF-8
letto come Latin-1 (Windows-1252)
Il latin1 di MySQL è Windows-1252, la codifica abituale di questi dump.
Riga del report: charset_guessed
sjis, cp932, gbk, big5 dumps
letto come UTF-8, con un avviso
Queste codifiche non vengono ancora decodificate.
Riga del report: unsupported_charset
UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rows
valutate
Alcuni strumenti di dump scrivono i valori come queste chiamate; vengono letti come i valori che producono, e il WKT geografico viene convertito mettendo prima la longitudine.
other expressions in rows
NULL
Un convertitore che non esegue un database non può valutarle.
Riga del report: expression_value
DEFAULT in VALUES
il valore predefinito della colonna
Un valore predefinito letterale viene copiato nella riga.
Riga del report: default_keyword_filled
DEFAULT in VALUES without a literal default
NULL
Non c'è nessun valore da copiare.
Riga del report: default_keyword_null
REPLACE and INSERT IGNORE
righe semplici
Un dump ha una riga per chiave, quindi le righe sono le stesse.
Riga del report: replace_as_insert
types IntoSQL doesn't know
nvarchar(max)
Il testo contiene qualsiasi valore; cambia il tipo dopo il caricamento.
Riga del report: unknown_type
values that don't fit their column
NULL
Un dump danneggiato o scritto a mano può contenere valori che la colonna non ammette; diventano NULL così il resto si carica.
Riga del report: invalid_value_null
unreadable geometries
NULL
I byte che non sono una geometria non si possono salvare come tale.
Riga del report: bad_geometry
CREATE SEQUENCE (MariaDB)
CREATE SEQUENCE ... AS bigint, con il suo valore successivo
SQL Server ha sequenze con le stesse opzioni; ognuna riparte da dove l'ha lasciata il dump.
VECTOR(n) (MariaDB 11.7+)
nvarchar(max) con i float come array JSON
Solo SQL Server 2025 ha un tipo vector; un array JSON mantiene ogni float su ogni versione.
Riga del report: type_replaced
| In MariaDB | In SQL Server | Riga del report |
|---|---|---|
| TINYINT(1), BOOL | bit quando ogni valore è 0 o 1, altrimenti smallintIl BOOL di MySQL è un TINYINT(1) che può contenere qualsiasi numero da -128 a 127. Una colonna che contiene solo 0 e 1 diventa bit; una che contiene 2 o -1 resta un numero, così nessun valore cambia significato. | bool_kept_numeric |
| UNSIGNED integers | TINYINT UNSIGNED come tinyint; gli altri come l'intero più ampio successivo con un CHECK che non sia negativo, BIGINT UNSIGNED come bigint quando ogni valore ci sta, altrimenti decimal(38,0)SQL Server non ha interi senza segno tranne tinyint, che va da 0 a 255. Un tipo più ampio contiene tutto l'intervallo senza segno, e il vincolo CHECK tiene fuori i valori negativi come faceva MySQL. | unsigned_widened |
| ZEROFILL and display widths | rimossoIl riempimento con zeri è un modo di mostrare un numero, non ne fa parte. I numeri restano; formattali quando li leggi se il riempimento conta. | zerofill_dropped |
| FLOAT(M,D) | real o float, senza la scalaI float di SQL Server non hanno una scala fissa. I valori salvati vengono copiati così come sono. | float_scale_dropped |
| DECIMAL(p,s) | decimal(p,s) fino a 38 cifre; nvarchar oltreIl decimal di SQL Server contiene 38 cifre. I decimali più ampi restano come testo, così ogni cifra resta esatta. | decimal_as_text |
| BIT(1), BIT(n) | bit; bigint fino a 63 bit; decimal(20,0) per BIT(64)Un singolo bit è un sì o un no; i campi di bit più ampi vengono salvati come il numero formato dai loro bit. | |
| zero, partial or impossible dates (0000-00-00, 2024-02-30) | NULLSQL Server salva solo date reali del calendario. MySQL conserva date zero e impossibili quando la sua modalità SQL lo consente; diventano NULL e il report le conta. | invalid_date_null |
| NOT NULL columns with values that become NULL | NOT NULL rimossoUna colonna i cui valori sono dovuti diventare NULL non può mantenere NOT NULL, altrimenti il caricamento si fermerebbe. | not_null_relaxed |
| DEFAULT '0000-00-00' | nessun valore predefinitoUn valore predefinito che SQL Server non può salvare viene omesso invece di essere sostituito con una data inventata. | zero_date_default |
| TIME | time quando ogni valore sta in un giorno, altrimenti nvarcharIl TIME di MySQL è una durata da -838:59:59 a 838:59:59; il time di SQL Server è un'ora del giorno. Una colonna con valori più lunghi o negativi li mantiene come testo. | time_as_interval |
| YEAR | smallint con un CHECK del suo intervalloSQL Server non ha un tipo anno; il vincolo CHECK mantiene gli stessi valori che MySQL consente. | |
| CHAR(n), VARCHAR(n) | nvarchar(n)nvarchar contiene ogni carattere su ogni versione supportata, e MySQL restituisce i valori CHAR senza spazi finali, come li mantiene nvarchar. | |
| text with characters past U+FFFF (emoji) in VARCHAR(n) | nvarchar(2n), o nvarchar(max) oltre 4000nvarchar conta unità UTF-16 e un'emoji ne occupa due, quindi la colonna ha spazio per ogni valore. | text_length_widened |
| DATETIME | datetime2Un DATETIME è l'ora letta su un orologio, senza fuso orario, come datetime2. | |
| TIMESTAMP | datetimeoffset nel fuso orario indicato dal dump, UTC se non ne indica unoUn TIMESTAMP è un istante. I dump indicano il fuso in cui lo hanno scritto (mysqldump scrive UTC); senza questa indicazione, i valori vengono letti come UTC e il report lo dice. | timestamp_zone_assumed |
| ENUM | nvarchar con un CHECK dei suoi valoriIl testo con un vincolo CHECK mantiene gli stessi valori. | |
| ENUM holding '' (MySQL's error value) | il valore vuoto ammesso dal vincolo CHECKMySQL salva una stringa vuota quando un valore non valido entra in un ENUM con una modalità SQL permissiva. Quelle righe restano e il vincolo CHECK le ammette. | enum_invalid_value |
| ENUM holding values outside its list | nessun CHECKI valori che la lista non nomina violerebbero il vincolo CHECK, quindi il vincolo non viene creato. | enum_check_skipped |
| SET | nvarchar come lo scrive MySQL ('a,b')SQL Server non ha array; il testo è quello che restituisce MySQL. | |
| JSON | nvarchar(max)Le funzioni JSON di SQL Server leggono il JSON dal testo. Un CHECK con ISJSON rifiuterebbe prima di SQL Server 2022 valori scalari come 1 o "x", che MySQL mantiene. | |
| NUL bytes in text | mantenutonvarchar può contenere un carattere NUL, quindi il valore viene copiato così com'è. | |
| text that isn't valid in its character set | i byte errati come carattere di sostituzioneIl testo va letto come caratteri per essere scritto come nvarchar. | invalid_utf8_replaced |
| text decoded twice (ñ) | copiato così com'èIl dump contiene esattamente questi caratteri, quindi vengono copiati; il report li segnala. | mojibake_suspected |
| AUTO_INCREMENT | IDENTITY, con il contatore impostato oltre gli id copiatiGli id copiati si caricano con IDENTITY_INSERT, e il contatore riparte dopo il più alto o dopo l'AUTO_INCREMENT del dump, se è maggiore. | |
| MyISAM AUTO_INCREMENT on the second column of a key | un solo contatore per la tabellaMyISAM conta per gruppo della prima colonna della chiave; SQL Server ha un contatore per tabella. | myisam_group_autoincrement |
| ON UPDATE CURRENT_TIMESTAMP | un trigger AFTER UPDATEIl trigger imposta la colonna all'ora corrente quando un aggiornamento non la imposta. Fa il join sulla chiave primaria, quindi la tabella ne deve avere una. | on_update_trigger |
| ON UPDATE CURRENT_TIMESTAMP on a table without a primary key | non riportatoIl trigger trova le righe aggiornate tramite la chiave primaria; senza, non può. | on_update_without_key |
| generated columns | colonne calcolate, PERSISTED quando la sorgente le salvaSQL Server le calcola negli stessi due modi. | |
| generated columns with functions SQL Server lacks | una colonna sempliceUna formula che non si può scrivere per SQL Server lascia una colonna semplice e una riga nel report. | generated_not_translated |
| INVISIBLE columns | colonne normaliSQL Server non ha colonne invisibili. | invisible_column |
| CHECK constraints | tradotti, dentro CREATE TABLEI CHECK nella tabella si verificano mentre ogni riga si carica. | |
| CHECK constraints with functions SQL Server lacks | non creatoUn vincolo CHECK che non si può scrivere per SQL Server viene omesso e segnalato. | check_skipped |
| CHECK ... NOT ENFORCED | non creatiMySQL conserva questi vincoli senza applicarli, quindi le righe possono violarli. | check_not_enforced |
| defaults with functions SQL Server lacks | nessun valore predefinitoUn valore predefinito che non si può scrivere per SQL Server viene omesso e segnalato. | default_not_translated |
| keys and indexes on a prefix, c(20) | un indice sull'intera colonnaSQL Server indicizza colonne intere; una chiave univoca su un prefisso è univoca anche sull'intera colonna, quindi ogni riga si carica. | prefix_whole_column |
| FULLTEXT indexes | non creatoLa ricerca full-text di SQL Server richiede un catalogo e query proprie. | fulltext_not_created |
| SPATIAL indexes | non creatoUn indice spaziale su una colonna geometry richiede un riquadro di delimitazione che il dump non indica. | spatial_index_not_created |
| functional indexes, and indexes on columns of unlimited length | non creatoSQL Server non indicizza né le espressioni né le colonne nvarchar(max) e varbinary(max). | index_skipped |
| foreign keys | dopo i dati WITH NOCHECK, poi controllata con un avviso sulle righe orfaneI dump si caricano con FOREIGN_KEY_CHECKS=0 e MyISAM non controlla mai, quindi le righe senza un genitore sono comuni. La chiave viene creata per prima e controllata per ultima; le righe orfane la lasciano non controllata con un avviso invece di fermare il caricamento. | |
| ON DELETE or ON UPDATE that cascades in a cycle or along a second path | NO ACTIONSQL Server rifiuta le cascate che potrebbero raggiungere una tabella due volte; MySQL le consente. | foreign_key_action_dropped |
| foreign keys to columns without a unique key | non creataSQL Server richiede una chiave primaria o un indice univoco senza NULL sulle colonne referenziate; InnoDB no. | foreign_key_skipped |
| table and column names | come scritti; rinominati quando differiscono solo per maiuscoleIn SQL Server i nomi ignorano le maiuscole con la collation abituale. | identifier_renamed |
| names over 116 characters | accorciatoIn SQL Server i nomi arrivano a 128 caratteri, alcuni dei quali per i numeri che tengono distinti i nomi. | name_shortened |
| GEOMETRY, POINT, POLYGON... | geometry, con lo SRID di ogni valoreIl tipo geometry di SQL Server mantiene ogni forma e il suo sistema di riferimento spaziale. | |
| INET4, INET6, UUID (MariaDB) | nvarchar(39), uniqueidentifieruniqueidentifier è l'UUID di SQL Server; gli indirizzi restano come testo. | |
| BINARY, VARBINARY, BLOB | binary, varbinary, varbinary(max)I byte restano byte. | |
| PARTITION BY | una sola tabellaLe righe sono le stesse; partiziona di nuovo la tabella in SQL Server se serve. | partitions_dropped |
| WITH SYSTEM VERSIONING (MariaDB) | una tabella con le righe attualiUn dump contiene solo le righe attuali. | system_versioning_dropped |
| MyISAM, MEMORY and other engines | una tabella normaleSQL Server ha un solo motore di tabelle. | engine_dropped |
| views, triggers, procedures, functions and events | elencati nel reportIl loro codice è scritto nel linguaggio di MySQL, quindi vengono elencati perché tu li ricrei. | not_converted_objects |
| dumps without CREATE TABLE | tipi ricavati dai valoriUn dump fatto con --no-create-info contiene solo righe, quindi i tipi vengono dai valori. | no_schema |
| geometries in a dump without CREATE TABLE | geometryIl formato delle geometrie di MySQL viene riconosciuto dai valori. | |
| _ci collations | la collation del database, di solito case-insensitiveSQL Server confronta il testo ignorando le maiuscole con la sua collation abituale, come fa il _ci di MySQL. | |
| SET NAMES utf8 from utf8mb4 tables | convertito, con un avvisomysqldump di MySQL 5.x scrive utf8 a 3 byte per impostazione predefinita e sostituisce ogni emoji con un punto interrogativo prima che un convertitore veda il file. | dump_lost_four_byte_chars |
| dumps without SET NAMES whose text isn't UTF-8 | letto come Latin-1 (Windows-1252)Il latin1 di MySQL è Windows-1252, la codifica abituale di questi dump. | charset_guessed |
| sjis, cp932, gbk, big5 dumps | letto come UTF-8, con un avvisoQueste codifiche non vengono ancora decodificate. | unsupported_charset |
| UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rows | valutateAlcuni strumenti di dump scrivono i valori come queste chiamate; vengono letti come i valori che producono, e il WKT geografico viene convertito mettendo prima la longitudine. | |
| other expressions in rows | NULLUn convertitore che non esegue un database non può valutarle. | expression_value |
| DEFAULT in VALUES | il valore predefinito della colonnaUn valore predefinito letterale viene copiato nella riga. | default_keyword_filled |
| DEFAULT in VALUES without a literal default | NULLNon c'è nessun valore da copiare. | default_keyword_null |
| REPLACE and INSERT IGNORE | righe sempliciUn dump ha una riga per chiave, quindi le righe sono le stesse. | replace_as_insert |
| types IntoSQL doesn't know | nvarchar(max)Il testo contiene qualsiasi valore; cambia il tipo dopo il caricamento. | unknown_type |
| values that don't fit their column | NULLUn dump danneggiato o scritto a mano può contenere valori che la colonna non ammette; diventano NULL così il resto si carica. | invalid_value_null |
| unreadable geometries | NULLI byte che non sono una geometria non si possono salvare come tale. | bad_geometry |
| CREATE SEQUENCE (MariaDB) | CREATE SEQUENCE ... AS bigint, con il suo valore successivoSQL Server ha sequenze con le stesse opzioni; ognuna riparte da dove l'ha lasciata il dump. | |
| VECTOR(n) (MariaDB 11.7+) | nvarchar(max) con i float come array JSONSolo SQL Server 2025 ha un tipo vector; un array JSON mantiene ogni float su ogni versione. | type_replaced |
Carica lo script in SQL Server
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.
sqlcmd -b -f 65001 -S localhost -d mydb -i mariadb.sql_server.sqlLe chiavi esterne vengono aggiunte WITH NOCHECK e poi controllate. Se una riga punta a una riga che non esiste, lo script dice quale vincolo e lo lascia non controllato, invece di fallire a metà.
Per un dump grande, esegui sqlcmd sulla stessa macchina del server. Ogni lotto di massimo 1000 righe fa il commit da solo, così il log delle transazioni resta piccolo.
Fai il dump di MariaDB per il miglior risultato
Il convertitore legge ciò che il dump contiene. Con queste opzioni il dump conserva più dei tuoi dati:
- --default-character-set=utf8mb4 conserva emoji e altri caratteri a 4 byte, che un dump utf8mb3 perde prima che il convertitore lo veda.
- --hex-blob scrive le colonne binarie e i valori VECTOR in esadecimale, che resiste alla copia tra sistemi diversi.
- --routines --triggers --events aggiungono quegli oggetti al dump, così il report può elencarli.
Cosa non viene convertito
Viste, trigger, stored procedure, funzioni ed eventi sono scritti nel linguaggio proprio di MariaDB. Sono elencati per nome nel report, mai rimossi in silenzio, così puoi riscriverli per SQL Server.
Domande sulla conversione da MariaDB a SQL Server
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.
Da quali versioni di MariaDB può provenire il dump?
Dump di mariadb-dump e mysqldump su MariaDB dalla 10.3 alla 12, con un INSERT per tabella o uno per riga. Ogni dump di test viene da MariaDB 10.11, 11.4 e 11.8 ed è confrontato con la sorgente cella per cella.
Le colonne UUID, INET6, JSON e VECTOR vengono mantenute?
UUID diventa uniqueidentifier, le colonne INET nvarchar, JSON nvarchar(max) e VECTOR un array JSON dei suoi float. Le date zero diventano NULL e il report le conta.
I valori AUTO_INCREMENT e le sequenze vengono mantenuti?
Sì. Ogni colonna AUTO_INCREMENT diventa una colonna IDENTITY che riparte dopo l'id più alto. Le sequenze diventano sequenze di SQL Server, e i valori predefiniti che attingono da una continuano ad attingere da lì.
E le stored procedure e i trigger?
Sono elencati per nome nel report e non vengono convertiti, perché ogni database li scrive nel proprio linguaggio.
Su quali versioni di SQL Server si carica lo script?
SQL Server dalla 2017 alla 2025. Lo stesso script si carica su ognuna, fermandosi al primo errore se qualcosa va storto.