---
title: "Migrare MySQL a SQL Server nel browser"
description: "Migra un database MySQL o MariaDB a SQL Server: converti il suo dump in uno script con le stesse tabelle, chiavi e dati, e un report di ogni modifica."
canonical: https://intosql.com/it/mysql-in-sql-server
last_updated: 2026-10-15
---

# Migrare MySQL a SQL Server nel browser

Trascina un dump di mysqldump, mariadb-dump, mysqlpump, 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.

[Guida alla migrazione da MySQL a SQL Server](https://intosql.com/docs/migrations/mysql-to-sql-server)

[Tipi di dati da MySQL a SQL Server](https://intosql.com/docs/types/mysql-to-sql-server)

## Cosa cambia da MySQL 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.

| In MySQL | In SQL Server | Riga del report |
| --- | --- | --- |
| TINYINT(1), BOOL | bit quando ogni valore è 0 o 1, altrimenti smallint | `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) | `unsigned_widened` |
| ZEROFILL and display widths | rimosso | `zerofill_dropped` |
| FLOAT(M,D) | real o float, senza la scala | `float_scale_dropped` |
| DECIMAL(p,s) | decimal(p,s) fino a 38 cifre; nvarchar oltre | `decimal_as_text` |
| BIT(1), BIT(n) | bit; bigint fino a 63 bit; decimal(20,0) per BIT(64) |  |
| zero, partial or impossible dates (0000-00-00, 2024-02-30) | NULL | `invalid_date_null` |
| NOT NULL columns with values that become NULL | NOT NULL rimosso | `not_null_relaxed` |
| DEFAULT '0000-00-00' | nessun valore predefinito | `zero_date_default` |
| TIME | time quando ogni valore sta in un giorno, altrimenti nvarchar | `time_as_interval` |
| YEAR | smallint con un CHECK del suo intervallo |  |
| CHAR(n), VARCHAR(n) | nvarchar(n) |  |
| text with characters past U+FFFF (emoji) in VARCHAR(n) | nvarchar(2n), o nvarchar(max) oltre 4000 | `text_length_widened` |
| DATETIME | datetime2 |  |
| TIMESTAMP | datetimeoffset nel fuso orario indicato dal dump, UTC se non ne indica uno | `timestamp_zone_assumed` |
| ENUM | nvarchar con un CHECK dei suoi valori |  |
| ENUM holding '' (MySQL's error value) | il valore vuoto ammesso dal vincolo CHECK | `enum_invalid_value` |
| ENUM holding values outside its list | nessun CHECK | `enum_check_skipped` |
| SET | nvarchar come lo scrive MySQL ('a,b') |  |
| JSON | nvarchar(max) |  |
| NUL bytes in text | mantenuto |  |
| text that isn't valid in its character set | i byte errati come carattere di sostituzione | `invalid_utf8_replaced` |
| text decoded twice (Ã±) | copiato così com'è | `mojibake_suspected` |
| AUTO_INCREMENT | IDENTITY, con il contatore impostato oltre gli id copiati |  |
| MyISAM AUTO_INCREMENT on the second column of a key | un solo contatore per la tabella | `myisam_group_autoincrement` |
| ON UPDATE CURRENT_TIMESTAMP | un trigger AFTER UPDATE | `on_update_trigger` |
| ON UPDATE CURRENT_TIMESTAMP on a table without a primary key | non riportato | `on_update_without_key` |
| generated columns | colonne calcolate, PERSISTED quando la sorgente le salva |  |
| generated columns with functions SQL Server lacks | una colonna semplice | `generated_not_translated` |
| INVISIBLE columns | colonne normali | `invisible_column` |
| CHECK constraints | tradotti, dentro CREATE TABLE |  |
| CHECK constraints with functions SQL Server lacks | non creato | `check_skipped` |
| CHECK ... NOT ENFORCED | non creati | `check_not_enforced` |
| defaults with functions SQL Server lacks | nessun valore predefinito | `default_not_translated` |
| keys and indexes on a prefix, c(20) | un indice sull'intera colonna | `prefix_whole_column` |
| FULLTEXT indexes | non creato | `fulltext_not_created` |
| SPATIAL indexes | non creato | `spatial_index_not_created` |
| functional indexes, and indexes on columns of unlimited length | non creato | `index_skipped` |
| foreign keys | dopo i dati WITH NOCHECK, poi controllata con un avviso sulle righe orfane |  |
| ON DELETE or ON UPDATE that cascades in a cycle or along a second path | NO ACTION | `foreign_key_action_dropped` |
| foreign keys to columns without a unique key | non creata | `foreign_key_skipped` |
| table and column names | come scritti; rinominati quando differiscono solo per maiuscole | `identifier_renamed` |
| names over 116 characters | accorciato | `name_shortened` |
| GEOMETRY, POINT, POLYGON... | geometry, con lo SRID di ogni valore |  |
| INET4, INET6, UUID (MariaDB) | nvarchar(39), uniqueidentifier |  |
| BINARY, VARBINARY, BLOB | binary, varbinary, varbinary(max) |  |
| PARTITION BY | una sola tabella | `partitions_dropped` |
| WITH SYSTEM VERSIONING (MariaDB) | una tabella con le righe attuali | `system_versioning_dropped` |
| MyISAM, MEMORY and other engines | una tabella normale | `engine_dropped` |
| views, triggers, procedures, functions and events | elencati nel report | `not_converted_objects` |
| dumps without CREATE TABLE | tipi ricavati dai valori | `no_schema` |
| geometries in a dump without CREATE TABLE | geometry |  |
| _ci collations | la collation del database, di solito case-insensitive |  |
| SET NAMES utf8 from utf8mb4 tables | convertito, con un avviso | `dump_lost_four_byte_chars` |
| dumps without SET NAMES whose text isn't UTF-8 | letto come Latin-1 (Windows-1252) | `charset_guessed` |
| sjis, cp932, gbk, big5 dumps | letto come UTF-8, con un avviso | `unsupported_charset` |
| UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rows | valutate |  |
| other expressions in rows | NULL | `expression_value` |
| DEFAULT in VALUES | il valore predefinito della colonna | `default_keyword_filled` |
| DEFAULT in VALUES without a literal default | NULL | `default_keyword_null` |
| REPLACE and INSERT IGNORE | righe semplici | `replace_as_insert` |
| types IntoSQL doesn't know | nvarchar(max) | `unknown_type` |
| values that don't fit their column | NULL | `invalid_value_null` |
| unreadable geometries | NULL | `bad_geometry` |
| CREATE SEQUENCE (MariaDB) | CREATE SEQUENCE ... AS bigint, con il suo valore successivo |  |
| VECTOR(n) (MariaDB 11.7+) | nvarchar(max) con i float come array JSON | `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.

```shell
sqlcmd -b -f 65001 -S localhost -d mydb -i mysql.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 MySQL 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 utf8 perde prima che il convertitore lo veda.
- --hex-blob scrive le colonne binarie 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 ogni database. Sono elencati per nome nel report, mai rimossi in silenzio, così puoi riscriverli per SQL Server.

## Domande sulla conversione da MySQL a SQL Server

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

### Legge i dump di MariaDB?

Sì. I dump di mariadb-dump e di MariaDB dalla 10.3 alla 12 si convertono allo stesso modo, comprese le colonne INET6, INET4 e UUID di MariaDB.

### Cosa succede alle date 0000-00-00?

SQL Server non ha una data zero, quindi diventano NULL e la colonna accetta NULL. Il report dice quante erano in ogni colonna.

### I valori AUTO_INCREMENT vengono mantenuti?

Sì. Ogni colonna AUTO_INCREMENT diventa una colonna IDENTITY, ogni riga mantiene il suo id e l'id successivo riparte dopo il più alto, o dopo l'AUTO_INCREMENT della tabella se è maggiore.

### TINYINT(1) diventa boolean?

Diventa bit solo quando ogni valore della colonna è 0 o 1. Se contiene altri numeri, come 2 o -1, resta un numero e il report spiega perché, così nessun valore diventa 1 per sbaglio.

### 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. ON UPDATE CURRENT_TIMESTAMP è l'eccezione: diventa un trigger di SQL Server.

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

## Da MySQL

- [Da MySQL a PostgreSQL](https://intosql.com/it/mysql-in-postgresql)
- [Da MySQL a MySQL](https://intosql.com/it/mysql-in-mysql)
- [Da MySQL a MariaDB](https://intosql.com/it/mysql-in-mariadb)
- [Da MySQL a SQLite](https://intosql.com/it/mysql-in-sqlite)
- [Da MySQL a Oracle](https://intosql.com/it/mysql-in-oracle)

## Verso SQL Server

- [Da MariaDB a SQL Server](https://intosql.com/it/mariadb-in-sql-server)
- [Da PostgreSQL a SQL Server](https://intosql.com/it/postgresql-in-sql-server)
- [Da SQL Server a SQL Server](https://intosql.com/it/sql-server-in-sql-server)
- [Da SQLite a SQL Server](https://intosql.com/it/sqlite-in-sql-server)
- [Da Oracle a SQL Server](https://intosql.com/it/oracle-in-sql-server)

## Guida e tutte le coppie

- [Da SQL Server a MySQL](https://intosql.com/it/sql-server-in-mysql)
- [Guida alla migrazione da MySQL a SQL Server](https://intosql.com/docs/migrations/mysql-to-sql-server)
- [Tipi di dati da MySQL a SQL Server](https://intosql.com/docs/types/mysql-to-sql-server)
- [Tutte le coppie di database](https://intosql.com/it/migrazione-database)
