Vai al contenuto
Home di IntoSQL

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.

Il tuo file
sqlshop_2024_mariadb.sqlFile di esempio, 6,6 kB
Il tuo database

18 righe convertite, 10 correzioni, nessuna rifiutata

Mostra

Tabelle in shop_2024_mariadb.sqlDump MariaDB 11.8.9-MariaDB-ubu2404 · scritto da mariadb-dump · utf8mb4

  • customers8 righe4
    8 colonne
    idbigint not null
    namenvarchar(200) not null
    emailnvarchar(150) not null
    countrynvarchar(2) not null
    is_activebit not null
    signed_update
    created_atdatetimeoffset(0) not null
    last_ipnvarchar(39)
  • orders10 righe6
    12 colonne
    idbigint not null
    customer_idbigint not null
    statusnvarchar(9) not null
    totaldecimal(10,2) not null
    itemsint not null
    ordered_atdatetime2(0) not null
    shipped_atdatetime2(0)
    notenvarchar(510)
    order_refuniqueidentifier not null
    invoiceint not null
    detailsnvarchar(max)
    updated_atdatetimeoffset(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

  1. "id" di customers è senza segno, quindi è diventata bigint con un vincolo CHECK che non sia negativa.
  2. "name" di customers contiene caratteri che SQL Server conta due volte, come le emoji, quindi è nvarchar(200).
  3. "signed_up" di customers ora ammette NULL: alcuni dei suoi valori non si potevano salvare e sono NULL.
  4. 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.
  5. "customer_id" di orders è senza segno, quindi è diventata bigint con un vincolo CHECK che non sia negativa.
  6. "id" di orders è senza segno, quindi è diventata bigint con un vincolo CHECK che non sia negativa.
  7. "items" di orders è senza segno, quindi è diventata int con un vincolo CHECK che non sia negativa.
  8. "note" di orders contiene caratteri che SQL Server conta due volte, come le emoji, quindi è nvarchar(510).
  9. 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.
  10. "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 MariaDBIn SQL ServerRiga del report
TINYINT(1), BOOLbit 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 integersTINYINT 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 widthsrimossoIl 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 NULLNOT 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
TIMEtime 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
YEARsmallint 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
DATETIMEdatetime2Un DATETIME è l'ora letta su un orologio, senza fuso orario, come datetime2.
TIMESTAMPdatetimeoffset 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
ENUMnvarchar 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 listnessun CHECKI valori che la lista non nomina violerebbero il vincolo CHECK, quindi il vincolo non viene creato.enum_check_skipped
SETnvarchar come lo scrive MySQL ('a,b')SQL Server non ha array; il testo è quello che restituisce MySQL.
JSONnvarchar(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 textmantenutonvarchar può contenere un carattere NUL, quindi il valore viene copiato così com'è.
text that isn't valid in its character seti 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_INCREMENTIDENTITY, 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 keyun 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_TIMESTAMPun 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 keynon riportatoIl trigger trova le righe aggiornate tramite la chiave primaria; senza, non può.on_update_without_key
generated columnscolonne calcolate, PERSISTED quando la sorgente le salvaSQL Server le calcola negli stessi due modi.
generated columns with functions SQL Server lacksuna colonna sempliceUna formula che non si può scrivere per SQL Server lascia una colonna semplice e una riga nel report.generated_not_translated
INVISIBLE columnscolonne normaliSQL Server non ha colonne invisibili.invisible_column
CHECK constraintstradotti, dentro CREATE TABLEI CHECK nella tabella si verificano mentre ogni riga si carica.
CHECK constraints with functions SQL Server lacksnon creatoUn vincolo CHECK che non si può scrivere per SQL Server viene omesso e segnalato.check_skipped
CHECK ... NOT ENFORCEDnon creatiMySQL conserva questi vincoli senza applicarli, quindi le righe possono violarli.check_not_enforced
defaults with functions SQL Server lacksnessun 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 indexesnon creatoLa ricerca full-text di SQL Server richiede un catalogo e query proprie.fulltext_not_created
SPATIAL indexesnon 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 lengthnon creatoSQL Server non indicizza né le espressioni né le colonne nvarchar(max) e varbinary(max).index_skipped
foreign keysdopo 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 pathNO 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 keynon creataSQL Server richiede una chiave primaria o un indice univoco senza NULL sulle colonne referenziate; InnoDB no.foreign_key_skipped
table and column namescome scritti; rinominati quando differiscono solo per maiuscoleIn SQL Server i nomi ignorano le maiuscole con la collation abituale.identifier_renamed
names over 116 charactersaccorciatoIn 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, BLOBbinary, varbinary, varbinary(max)I byte restano byte.
PARTITION BYuna 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 enginesuna tabella normaleSQL Server ha un solo motore di tabelle.engine_dropped
views, triggers, procedures, functions and eventselencati nel reportIl loro codice è scritto nel linguaggio di MySQL, quindi vengono elencati perché tu li ricrei.not_converted_objects
dumps without CREATE TABLEtipi 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 TABLEgeometryIl formato delle geometrie di MySQL viene riconosciuto dai valori.
_ci collationsla 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 tablesconvertito, 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-8letto come Latin-1 (Windows-1252)Il latin1 di MySQL è Windows-1252, la codifica abituale di questi dump.charset_guessed
sjis, cp932, gbk, big5 dumpsletto come UTF-8, con un avvisoQueste codifiche non vengono ancora decodificate.unsupported_charset
UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rowsvalutateAlcuni 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 rowsNULLUn convertitore che non esegue un database non può valutarle.expression_value
DEFAULT in VALUESil valore predefinito della colonnaUn valore predefinito letterale viene copiato nella riga.default_keyword_filled
DEFAULT in VALUES without a literal defaultNULLNon c'è nessun valore da copiare.default_keyword_null
REPLACE and INSERT IGNORErighe sempliciUn dump ha una riga per chiave, quindi le righe sono le stesse.replace_as_insert
types IntoSQL doesn't knownvarchar(max)Il testo contiene qualsiasi valore; cambia il tipo dopo il caricamento.unknown_type
values that don't fit their columnNULLUn 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 geometriesNULLI 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.sql

Le 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.