---
title: "Migrar MySQL a SQL Server en tu navegador"
description: "Migra una base de datos MySQL o MariaDB a SQL Server: convierte su volcado en un script con las mismas tablas, claves y datos, y un informe de cada cambio."
canonical: https://intosql.com/es/mysql-a-sql-server
last_updated: 2026-10-15
---

# Migrar MySQL a SQL Server en tu navegador

Suelta un volcado de mysqldump, mariadb-dump, mysqlpump, phpMyAdmin o Adminer, en .sql o .sql.gz, y descarga un script de SQL Server con las mismas tablas, claves, índices y datos. Cada valor que SQL Server no puede guardar tal cual, y cada objeto que no admite, aparece en el informe.

[Guía de migración de MySQL a SQL Server](https://intosql.com/docs/migrations/mysql-to-sql-server)

[Tipos de datos de MySQL a SQL Server](https://intosql.com/docs/types/mysql-to-sql-server)

## Qué cambia de MySQL a SQL Server

Cada fila es una regla que aplica el convertidor, con la línea que escribe en el informe cuando la regla cambia algo en tus datos.

| En MySQL | En SQL Server | Línea del informe |
| --- | --- | --- |
| TINYINT(1), BOOL | bit cuando cada valor es 0 o 1, si no smallint | `bool_kept_numeric` |
| UNSIGNED integers | TINYINT UNSIGNED como tinyint; los demás, el siguiente entero más amplio con un CHECK de que no sea negativo, BIGINT UNSIGNED como bigint cuando cada valor cabe, si no decimal(38,0) | `unsigned_widened` |
| ZEROFILL and display widths | se descarta | `zerofill_dropped` |
| FLOAT(M,D) | real o float, sin la escala | `float_scale_dropped` |
| DECIMAL(p,s) | decimal(p,s) hasta 38 dígitos; nvarchar si son más | `decimal_as_text` |
| BIT(1), BIT(n) | bit; bigint hasta 63 bits; decimal(20,0) para 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 | sin NOT NULL | `not_null_relaxed` |
| DEFAULT '0000-00-00' | sin valor predeterminado | `zero_date_default` |
| TIME | time cuando cada valor cabe en un día, si no nvarchar | `time_as_interval` |
| YEAR | smallint con un CHECK de su rango |  |
| CHAR(n), VARCHAR(n) | nvarchar(n) |  |
| text with characters past U+FFFF (emoji) in VARCHAR(n) | nvarchar(2n), o nvarchar(max) a partir de 4000 | `text_length_widened` |
| DATETIME | datetime2 |  |
| TIMESTAMP | datetimeoffset en la zona horaria que indica el volcado, UTC si no indica ninguna | `timestamp_zone_assumed` |
| ENUM | nvarchar con un CHECK de sus valores |  |
| ENUM holding '' (MySQL's error value) | el valor vacío, que el CHECK admite | `enum_invalid_value` |
| ENUM holding values outside its list | sin CHECK | `enum_check_skipped` |
| SET | nvarchar tal como lo escribe MySQL ('a,b') |  |
| JSON | nvarchar(max) |  |
| NUL bytes in text | se conserva |  |
| text that isn't valid in its character set | los bytes incorrectos como carácter de reemplazo | `invalid_utf8_replaced` |
| text decoded twice (Ã±) | se copia tal cual | `mojibake_suspected` |
| AUTO_INCREMENT | IDENTITY, con el contador después de los ids copiados |  |
| MyISAM AUTO_INCREMENT on the second column of a key | un contador para la tabla | `myisam_group_autoincrement` |
| ON UPDATE CURRENT_TIMESTAMP | un disparador AFTER UPDATE | `on_update_trigger` |
| ON UPDATE CURRENT_TIMESTAMP on a table without a primary key | no se traslada | `on_update_without_key` |
| generated columns | columnas calculadas, PERSISTED cuando el origen las guarda |  |
| generated columns with functions SQL Server lacks | una columna simple | `generated_not_translated` |
| INVISIBLE columns | columnas normales | `invisible_column` |
| CHECK constraints | traducido, en línea en CREATE TABLE |  |
| CHECK constraints with functions SQL Server lacks | no se crea | `check_skipped` |
| CHECK ... NOT ENFORCED | no se crea | `check_not_enforced` |
| defaults with functions SQL Server lacks | sin valor predeterminado | `default_not_translated` |
| keys and indexes on a prefix, c(20) | un índice sobre la columna completa | `prefix_whole_column` |
| FULLTEXT indexes | no se crea | `fulltext_not_created` |
| SPATIAL indexes | no se crea | `spatial_index_not_created` |
| functional indexes, and indexes on columns of unlimited length | no se crea | `index_skipped` |
| foreign keys | después de los datos, WITH NOCHECK, luego comprobada con una advertencia si hay huérfanas |  |
| 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 | no se crea | `foreign_key_skipped` |
| table and column names | tal como están escritos; renombrados cuando solo difieren en mayúsculas | `identifier_renamed` |
| names over 116 characters | acortado | `name_shortened` |
| GEOMETRY, POINT, POLYGON... | geometry, con el SRID de cada valor |  |
| INET4, INET6, UUID (MariaDB) | nvarchar(39), uniqueidentifier |  |
| BINARY, VARBINARY, BLOB | binary, varbinary, varbinary(max) |  |
| PARTITION BY | una sola tabla | `partitions_dropped` |
| WITH SYSTEM VERSIONING (MariaDB) | una tabla con las filas actuales | `system_versioning_dropped` |
| MyISAM, MEMORY and other engines | una tabla normal | `engine_dropped` |
| views, triggers, procedures, functions and events | listados en el informe | `not_converted_objects` |
| dumps without CREATE TABLE | tipos leídos de los valores | `no_schema` |
| geometries in a dump without CREATE TABLE | geometry |  |
| _ci collations | la intercalación de la base de datos, normalmente sin distinguir mayúsculas |  |
| SET NAMES utf8 from utf8mb4 tables | se convierte, con una advertencia | `dump_lost_four_byte_chars` |
| dumps without SET NAMES whose text isn't UTF-8 | se lee como Latin-1 (Windows-1252) | `charset_guessed` |
| sjis, cp932, gbk, big5 dumps | se lee como UTF-8, con una advertencia | `unsupported_charset` |
| UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rows | se evalúan |  |
| other expressions in rows | NULL | `expression_value` |
| DEFAULT in VALUES | el valor predeterminado de la columna | `default_keyword_filled` |
| DEFAULT in VALUES without a literal default | NULL | `default_keyword_null` |
| REPLACE and INSERT IGNORE | filas simples | `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 su siguiente valor |  |
| VECTOR(n) (MariaDB 11.7+) | nvarchar(max) con los números de punto flotante como arreglo JSON | `type_replaced` |

## Carga el script en SQL Server

El script crea las tablas, copia las filas y luego agrega claves, índices y claves foráneas, así que carga rápido y se detiene en el primer error.

```shell
sqlcmd -b -f 65001 -S localhost -d mydb -i mysql.sql_server.sql
```

Las claves foráneas se agregan WITH NOCHECK y luego se comprueban. Si una fila apunta a una fila que no existe, el script dice qué restricción es y la deja sin comprobar, en lugar de fallar a medias.

Para un volcado grande, ejecuta sqlcmd en la misma máquina que el servidor. Cada lote de hasta 1000 filas se confirma por separado, así que el registro de transacciones se mantiene pequeño.

## Haz el volcado de MySQL para el mejor resultado

El convertidor lee lo que contiene el volcado. Estas opciones conservan más de tus datos en él:

- --default-character-set=utf8mb4 conserva los emoji y otros caracteres de 4 bytes, que un volcado utf8 pierde antes de que el convertidor lo vea.
- --hex-blob escribe las columnas binarias en hexadecimal, que sobrevive a la copia entre sistemas.
- --routines --triggers --events agregan esos objetos al volcado, para que el informe pueda listarlos.

## Qué no se convierte

Las vistas, los disparadores, los procedimientos almacenados, las funciones y los eventos se escriben en el lenguaje propio de cada base de datos. Aparecen en el informe por nombre, nunca se descartan en silencio, para que puedas reescribirlos para SQL Server.

## Preguntas sobre MySQL a SQL Server

### ¿Se sube mi volcado?

No. El convertidor se ejecuta en tu navegador y lee el volcado de tu disco por partes, así que nunca sale de tu computadora. La app de escritorio y la línea de comandos también convierten en tu computadora.

### ¿Qué tan grande puede ser el volcado?

El convertidor nunca tiene todo el volcado en memoria: lee el archivo dos veces, por rangos, y escribe el script sobre la marcha. Los volcados de varios gigabytes se convierten en el navegador, en la app de escritorio y con la línea de comandos.

### ¿Lee volcados de MariaDB?

Sí. Los volcados de mariadb-dump y de MariaDB 10.3 a 12 se convierten de la misma forma, incluidas las columnas INET6, INET4 y UUID de MariaDB.

### ¿Qué pasa con las fechas 0000-00-00?

SQL Server no tiene fecha cero, así que se vuelven NULL y la columna acepta NULL. El informe dice cuántas había en cada columna.

### ¿Se conservan los valores AUTO_INCREMENT?

Sí. Cada columna AUTO_INCREMENT se vuelve una columna IDENTITY, cada fila conserva su id, y el siguiente id sigue después del más alto, o después del AUTO_INCREMENT de la tabla si es mayor.

### ¿TINYINT(1) se vuelve boolean?

Se vuelve bit solo cuando cada valor de la columna es 0 o 1. Si contiene otros números, como 2 o -1, sigue siendo un número y el informe dice por qué, así que ningún valor se vuelve 1 por accidente.

### ¿Qué pasa con los procedimientos almacenados y los disparadores?

Aparecen en el informe por nombre y no se convierten, porque cada base de datos los escribe en su propio lenguaje. ON UPDATE CURRENT_TIMESTAMP es la excepción: se vuelve un disparador de SQL Server.

### ¿En qué versiones de SQL Server carga el script?

SQL Server 2017 a 2025. El mismo script carga en cada una, y se detiene en el primer error si algo sale mal.

## Desde MySQL

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

## Hacia SQL Server

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

## Guía y todos los pares

- [SQL Server a MySQL](https://intosql.com/es/sql-server-a-mysql)
- [Guía de migración de MySQL a SQL Server](https://intosql.com/docs/migrations/mysql-to-sql-server)
- [Tipos de datos de MySQL a SQL Server](https://intosql.com/docs/types/mysql-to-sql-server)
- [Todos los pares de bases de datos](https://intosql.com/es/migracion-de-bases-de-datos)
