Saltar al contenido
Inicio de IntoSQL

Convierte MySQL a SQL Server

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.

Tu archivo
sqlshop_2024.sqlArchivo de ejemplo, 5,1 kB
Tu base de datos

18 filas convertidas, 10 correcciones, ninguna rechazada

Mostrar

Tablas en shop_2024.sqlVolcado de MySQL 8.0.46 · escrito por mysqldump · utf8mb4

  • customers8 filas4
    7 columnas
    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
  • orders10 filas6
    9 columnas
    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)
    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 TABLE [dbo].[customers] (
    [id] bigint IDENTITY(1001, 1) NOT NULL,
    [name] nvarchar(200) NOT NULL,
    [email] nvarchar(150) NOT NULL,
    [country] nvarchar(2) DEFAULT N'US' NOT NULL,
    [is_active] bit DEFAULT 1 NOT NULL,
    [signed_up] date NULL,
    [created_at] datetimeoffset(0) DEFAULT SYSDATETIMEOFFSET() NOT NULL,
    CONSTRAINT [CK_customers_id] CHECK ([id] >= 0),
    CONSTRAINT [PK_customers] PRIMARY KEY ([id])
);
GO

CREATE TABLE [dbo].[orders] (
    [id] bigint IDENTITY(5001, 1) NOT NULL,
    [customer_id] bigint NOT NULL,
    [status] nvarchar(9) DEFAULT N'pending' NOT NULL,
    [total] decimal(10,2) NOT NULL,
    [items] int DEFAULT 1 NOT NULL,
    [ordered_at] datetime2(0) NOT NULL,
    [shipped_at] datetime2(0) NULL,
    [note] nvarchar(510) NULL,
    [updated_at] datetimeoffset(0) DEFAULT SYSDATETIMEOFFSET() NOT NULL,
    CONSTRAINT [CK_orders_id] CHECK ([id] >= 0),
    CONSTRAINT [CK_orders_customer_id] CHECK ([customer_id] >= 0),
    CONSTRAINT [CK_orders_status] CHECK ([status] IN (N'pending', N'paid', N'shipped', N'cancelled', N'')),
    CONSTRAINT [CK_orders_items] CHECK ([items] >= 0),
    CONSTRAINT [PK_orders] PRIMARY KEY ([id])
);
GO

SET IDENTITY_INSERT [dbo].[customers] ON;
INSERT INTO [dbo].[customers] ([id], [name], [email], [country], [is_active], [signed_up], [created_at]) VALUES
(1,N'Ana Martínez',N'ana@example.com',N'MX',1,'2023-01-15','2023-01-15 10:24:00+00:00'),
(2,N'Zoë Müller',N'zoe@example.de',N'DE',1,'2023-02-03','2023-02-03 08:11:42+00:00'),
(3,N'José Peña',N'jose@example.es',N'ES',0,'2023-03-21','2023-03-21 19:05:17+00:00'),
(4,N'李雷',N'lilei@example.cn',N'CN',1,'2023-05-09','2023-05-09 02:40:00+00:00'),
(5,N'Noah O''Brien',N'noah@example.ie',N'IE',1,NULL,'2023-06-30 14:00:00+00:00'),
(6,N'Amélie Laurent',N'amelie@example.fr',N'FR',1,'2024-01-02','2024-01-02 09:30:00+00:00'),
(7,N'Ravi Patel',N'ravi@example.in',N'IN',0,'2024-02-29','2024-02-29 23:59:59+00:00'),
(8,N'Sofia Rossi 🌻',N'sofia@example.it',N'IT',1,'2024-04-12','2024-04-12 12:12:12+00:00');
SET IDENTITY_INSERT [dbo].[customers] OFF;
GO
SET IDENTITY_INSERT [dbo].[orders] ON;
INSERT INTO [dbo].[orders] ([id], [customer_id], [status], [total], [items], [ordered_at], [shipped_at], [note], [updated_at]) VALUES
(1,1,N'shipped',129.90,3,'2024-03-01 10:00:00','2024-03-02 16:30:00',NULL,'2024-03-02 16:30:00+00:00'),
(2,2,N'paid',54.00,1,'2024-03-02 11:15:00',NULL,N'Gift wrap 🎁','2024-03-02 11:20:00+00:00'),
(3,1,N'cancelled',12.50,1,'2024-03-03 09:45:00',NULL,N'Customer changed their mind','2024-03-03 10:00:00+00:00'),
(4,4,N'shipped',980.00,12,'2024-03-05 02:10:00','2024-03-07 08:00:00',N'请小心轻放','2024-03-07 08:00:00+00:00'),
(5,5,N'pending',45.75,2,'2024-03-08 17:20:00',NULL,N'Leave at the door; ring twice','2024-03-08 17:20:00+00:00'),
(6,6,N'shipped',310.40,5,'2024-03-10 13:00:00','2024-03-11 09:00:00',N'Fragile: "glass"','2024-03-11 09:00:00+00:00'),
(7,8,N'paid',76.20,2,'2024-03-11 18:45:00',NULL,NULL,'2024-03-11 18:46:00+00:00'),
(8,2,N'',19.99,1,'2024-03-12 08:00:00',NULL,N'Status lost in an old import','2024-03-12 08:00:00+00:00'),
(9,3,N'shipped',64.00,2,'2024-03-14 15:30:00',NULL,N'Shipping date never recorded','2024-03-15 10:00:00+00:00'),
(10,7,N'paid',1499.00,1,'2024-03-15 21:05:00',NULL,N'C:\Users\ravi\invoice.pdf','2024-03-15 21:05:00+00:00');
SET IDENTITY_INSERT [dbo].[orders] OFF;
GO

-- Indexes, foreign keys, counters and triggers, after the rows.
CREATE UNIQUE INDEX [uq_email] ON [dbo].[customers] ([email]);
CREATE INDEX [idx_customer] ON [dbo].[orders] ([customer_id]);
CREATE INDEX [idx_status_date] ON [dbo].[orders] ([status], [ordered_at]);
ALTER TABLE [dbo].[orders] WITH NOCHECK ADD CONSTRAINT [fk_orders_customer] FOREIGN KEY ([customer_id]) REFERENCES [dbo].[customers] ([id]);
BEGIN TRY ALTER TABLE [dbo].[orders] WITH CHECK CHECK CONSTRAINT [fk_orders_customer]; END TRY BEGIN CATCH PRINT N'Foreign key ' + N'[fk_orders_customer]' + N' has rows without a parent: it stays unchecked, and new rows are checked.'; END CATCH;
DECLARE @next decimal(38,0) = (SELECT MAX([id]) FROM [dbo].[customers]); IF @next IS NOT NULL BEGIN IF @next < 1000 SET @next = 1000; DBCC CHECKIDENT (N'[dbo].[customers]', RESEED, @next) WITH NO_INFOMSGS; END;
GO
EXEC sys.sp_addextendedproperty @name = N'MS_Description', @value = N'People who bought at least once', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = N'customers';
DECLARE @next decimal(38,0) = (SELECT MAX([id]) FROM [dbo].[orders]); IF @next IS NOT NULL BEGIN IF @next < 5000 SET @next = 5000; DBCC CHECKIDENT (N'[dbo].[orders]', RESEED, @next) WITH NO_INFOMSGS; END;
GO
GO
CREATE TRIGGER [dbo].[TR_orders_updated_at_on_update] ON [dbo].[orders] AFTER UPDATE AS
BEGIN
    SET NOCOUNT ON;
    IF NOT UPDATE([updated_at])
        UPDATE x SET [updated_at] = SYSDATETIMEOFFSET() FROM [dbo].[orders] AS x JOIN inserted AS i ON x.[id] = i.[id];
END;
GO
GO

Correcciones

  1. "id" de customers no tiene signo, así que se volvió bigint con un CHECK de que no sea negativa.
  2. "name" de customers contiene caracteres que SQL Server cuenta dos veces, como los emoji, así que es nvarchar(200).
  3. "signed_up" de customers ahora admite NULL: algunos de sus valores no se pudieron guardar y quedan en NULL.
  4. El valor predeterminado de "signed_up" en customers, 0000‑00‑00, no es una fecha que SQL Server acepte, así que la columna no tiene valor predeterminado.
  5. "customer_id" de orders no tiene signo, así que se volvió bigint con un CHECK de que no sea negativa.
  6. "id" de orders no tiene signo, así que se volvió bigint con un CHECK de que no sea negativa.
  7. "items" de orders no tiene signo, así que se volvió int con un CHECK de que no sea negativa.
  8. "note" de orders contiene caracteres que SQL Server cuenta dos veces, como los emoji, así que es nvarchar(510).
  9. 1 fila de "status" en orders contiene el valor vacío que MySQL guarda para entradas no válidas; el CHECK de sus valores lo admite.
  10. "updated_at" de orders cambia a la hora actual en cada actualización; en SQL Server lo hace un disparador.

Para revisar

  • 1 valor en "signed_up" de customers es una fecha cero o imposible, como 0000‑00‑00, que SQL Server no puede guardar, así que queda en NULL. Si esas fechas significan algo, reemplázalas en el origen por fechas reales antes del volcado.
  • 1 valor en "shipped_at" de orders es una fecha cero o imposible, como 0000‑00‑00 00:00:00, que SQL Server no puede guardar, así que queda en NULL. Si esas fechas significan algo, reemplázalas en el origen por fechas reales antes del volcado.

Tu archivo se convierte en esta computadora y nunca se sube.

Otros ejemplos:

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.

  • TINYINT(1), BOOL

    bit cuando cada valor es 0 o 1, si no smallint

    El BOOL de MySQL es un TINYINT(1) que puede contener cualquier número de -128 a 127. Una columna que solo contiene 0 y 1 se vuelve bit; una que contiene 2 o -1 sigue siendo un número para que ningún valor cambie de significado.

    Línea del informe: 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)

    SQL Server no tiene enteros sin signo salvo tinyint, que va de 0 a 255. Un tipo más amplio contiene todo el rango sin signo, y el CHECK deja fuera los valores negativos como hacía MySQL.

    Línea del informe: unsigned_widened

  • ZEROFILL and display widths

    se descarta

    El relleno con ceros es una forma de mostrar un número, no parte de él. Los números se conservan; dales formato al leerlos si el relleno importa.

    Línea del informe: zerofill_dropped

  • FLOAT(M,D)

    real o float, sin la escala

    Los números de punto flotante de SQL Server no tienen escala fija. Los valores guardados se copian tal cual.

    Línea del informe: float_scale_dropped

  • DECIMAL(p,s)

    decimal(p,s) hasta 38 dígitos; nvarchar si son más

    El decimal de SQL Server admite 38 dígitos. Los decimales más anchos se guardan como texto para que cada dígito siga exacto.

    Línea del informe: decimal_as_text

  • BIT(1), BIT(n)

    bit; bigint hasta 63 bits; decimal(20,0) para BIT(64)

    Un solo bit es un sí o un no; los campos de bits más anchos se guardan como el número que forman sus bits.

  • zero, partial or impossible dates (0000-00-00, 2024-02-30)

    NULL

    SQL Server solo guarda fechas reales del calendario. MySQL conserva fechas cero e imposibles cuando su modo SQL lo permite; se vuelven NULL y el informe las cuenta.

    Línea del informe: invalid_date_null

  • NOT NULL columns with values that become NULL

    sin NOT NULL

    Una columna cuyos valores tuvieron que volverse NULL no puede conservar NOT NULL, o la carga se detendría.

    Línea del informe: not_null_relaxed

  • DEFAULT '0000-00-00'

    sin valor predeterminado

    Un valor predeterminado que SQL Server no puede guardar se deja fuera en lugar de reemplazarse por una fecha inventada.

    Línea del informe: zero_date_default

  • TIME

    time cuando cada valor cabe en un día, si no nvarchar

    El TIME de MySQL es una duración de -838:59:59 a 838:59:59; el time de SQL Server es una hora del día. Una columna con valores más largos o negativos los conserva como texto.

    Línea del informe: time_as_interval

  • YEAR

    smallint con un CHECK de su rango

    SQL Server no tiene un tipo para años; el CHECK conserva los mismos valores que MySQL permite.

  • CHAR(n), VARCHAR(n)

    nvarchar(n)

    nvarchar admite cualquier carácter en cada versión compatible, y MySQL devuelve los valores CHAR sin espacios finales, como los conserva nvarchar.

  • text with characters past U+FFFF (emoji) in VARCHAR(n)

    nvarchar(2n), o nvarchar(max) a partir de 4000

    nvarchar cuenta unidades UTF-16 y un emoji ocupa dos, así que la columna tiene espacio para cada valor.

    Línea del informe: text_length_widened

  • DATETIME

    datetime2

    Un DATETIME es una lectura de reloj sin zona horaria, como datetime2.

  • TIMESTAMP

    datetimeoffset en la zona horaria que indica el volcado, UTC si no indica ninguna

    Un TIMESTAMP es un instante. Los volcados indican la zona en que lo escribieron (mysqldump escribe UTC); si no la indican, los valores se leen como UTC y el informe lo dice.

    Línea del informe: timestamp_zone_assumed

  • ENUM

    nvarchar con un CHECK de sus valores

    El texto con un CHECK conserva los mismos valores.

  • ENUM holding '' (MySQL's error value)

    el valor vacío, que el CHECK admite

    MySQL guarda una cadena vacía cuando un valor no válido entra en un ENUM en un modo SQL permisivo. Esas filas se conservan y el CHECK las admite.

    Línea del informe: enum_invalid_value

  • ENUM holding values outside its list

    sin CHECK

    Los valores que la lista no nombra no cumplirían el CHECK, así que el CHECK no se crea.

    Línea del informe: enum_check_skipped

  • SET

    nvarchar tal como lo escribe MySQL ('a,b')

    SQL Server no tiene arreglos; el texto es el que devuelve MySQL.

  • JSON

    nvarchar(max)

    Las funciones JSON de SQL Server leen JSON desde texto. Un CHECK con ISJSON rechazaría valores escalares como 1 o "x" antes de SQL Server 2022, que MySQL conserva.

  • NUL bytes in text

    se conserva

    nvarchar puede contener un carácter NUL, así que el valor se copia tal cual.

  • text that isn't valid in its character set

    los bytes incorrectos como carácter de reemplazo

    El texto tiene que leerse como caracteres para escribirse como nvarchar.

    Línea del informe: invalid_utf8_replaced

  • text decoded twice (ñ)

    se copia tal cual

    El volcado contiene exactamente estos caracteres, así que se copian; el informe los señala.

    Línea del informe: mojibake_suspected

  • AUTO_INCREMENT

    IDENTITY, con el contador después de los ids copiados

    Los ids copiados se cargan con IDENTITY_INSERT, y el contador sigue después del más alto o del AUTO_INCREMENT del volcado, el que sea mayor.

  • MyISAM AUTO_INCREMENT on the second column of a key

    un contador para la tabla

    MyISAM cuenta por grupo de la primera columna de la clave; SQL Server tiene un contador por tabla.

    Línea del informe: myisam_group_autoincrement

  • ON UPDATE CURRENT_TIMESTAMP

    un disparador AFTER UPDATE

    El disparador pone la hora actual en la columna cuando una actualización no la asigna. Se une por la clave primaria, así que la tabla necesita una.

    Línea del informe: on_update_trigger

  • ON UPDATE CURRENT_TIMESTAMP on a table without a primary key

    no se traslada

    El disparador encuentra las filas actualizadas por su clave primaria; sin una, no puede.

    Línea del informe: on_update_without_key

  • generated columns

    columnas calculadas, PERSISTED cuando el origen las guarda

    SQL Server las calcula de las mismas dos formas.

  • generated columns with functions SQL Server lacks

    una columna simple

    Una fórmula que no se puede escribir para SQL Server deja una columna simple y una línea en el informe.

    Línea del informe: generated_not_translated

  • INVISIBLE columns

    columnas normales

    SQL Server no tiene columnas invisibles.

    Línea del informe: invisible_column

  • CHECK constraints

    traducido, en línea en CREATE TABLE

    Los CHECK en línea se comprueban al cargar cada fila.

  • CHECK constraints with functions SQL Server lacks

    no se crea

    Un CHECK que no se puede escribir para SQL Server se deja fuera y aparece en el informe.

    Línea del informe: check_skipped

  • CHECK ... NOT ENFORCED

    no se crea

    MySQL conserva estos CHECK sin aplicarlos, así que las filas pueden no cumplirlos.

    Línea del informe: check_not_enforced

  • defaults with functions SQL Server lacks

    sin valor predeterminado

    Un valor predeterminado que no se puede escribir para SQL Server se deja fuera y aparece en el informe.

    Línea del informe: default_not_translated

  • keys and indexes on a prefix, c(20)

    un índice sobre la columna completa

    SQL Server indexa columnas completas; una clave única sobre un prefijo también es única sobre la columna completa, así que cada fila carga.

    Línea del informe: prefix_whole_column

  • FULLTEXT indexes

    no se crea

    La búsqueda de texto completo de SQL Server necesita un catálogo y sus propias consultas.

    Línea del informe: fulltext_not_created

  • SPATIAL indexes

    no se crea

    Un índice espacial sobre una columna de geometría necesita un cuadro delimitador que el volcado no indica.

    Línea del informe: spatial_index_not_created

  • functional indexes, and indexes on columns of unlimited length

    no se crea

    SQL Server no indexa expresiones ni columnas nvarchar(max) y varbinary(max).

    Línea del informe: index_skipped

  • foreign keys

    después de los datos, WITH NOCHECK, luego comprobada con una advertencia si hay huérfanas

    Los volcados se cargan con FOREIGN_KEY_CHECKS=0 y MyISAM nunca comprueba, así que las filas sin padre son comunes. La clave se crea primero y se comprueba al final; las filas huérfanas la dejan sin comprobar con una advertencia en lugar de detener la carga.

  • ON DELETE or ON UPDATE that cascades in a cycle or along a second path

    NO ACTION

    SQL Server rechaza las propagaciones que podrían llegar dos veces a una tabla; MySQL las permite.

    Línea del informe: foreign_key_action_dropped

  • foreign keys to columns without a unique key

    no se crea

    SQL Server necesita una clave primaria o un índice único sin NULL en las columnas referenciadas; InnoDB no.

    Línea del informe: foreign_key_skipped

  • table and column names

    tal como están escritos; renombrados cuando solo difieren en mayúsculas

    Los nombres de SQL Server no distinguen mayúsculas con la intercalación habitual.

    Línea del informe: identifier_renamed

  • names over 116 characters

    acortado

    Los nombres de SQL Server admiten 128 caracteres, algunos para los números que mantienen distintos los nombres.

    Línea del informe: name_shortened

  • GEOMETRY, POINT, POLYGON...

    geometry, con el SRID de cada valor

    El tipo geometry propio de SQL Server conserva cada forma y su sistema de referencia espacial.

  • INET4, INET6, UUID (MariaDB)

    nvarchar(39), uniqueidentifier

    uniqueidentifier es el UUID de SQL Server; las direcciones se guardan como texto.

  • BINARY, VARBINARY, BLOB

    binary, varbinary, varbinary(max)

    Los bytes siguen siendo bytes.

  • PARTITION BY

    una sola tabla

    Las filas son las mismas; vuelve a particionar la tabla en SQL Server si lo necesita.

    Línea del informe: partitions_dropped

  • WITH SYSTEM VERSIONING (MariaDB)

    una tabla con las filas actuales

    Un volcado solo contiene las filas actuales.

    Línea del informe: system_versioning_dropped

  • MyISAM, MEMORY and other engines

    una tabla normal

    SQL Server tiene un solo motor de tablas.

    Línea del informe: engine_dropped

  • views, triggers, procedures, functions and events

    listados en el informe

    Su código está escrito en el lenguaje de MySQL, así que se listan para que los vuelvas a crear.

    Línea del informe: not_converted_objects

  • dumps without CREATE TABLE

    tipos leídos de los valores

    Un volcado hecho con --no-create-info solo tiene filas, así que los tipos salen de los valores.

    Línea del informe: no_schema

  • geometries in a dump without CREATE TABLE

    geometry

    El formato de geometría de MySQL se reconoce por los valores.

  • _ci collations

    la intercalación de la base de datos, normalmente sin distinguir mayúsculas

    SQL Server compara el texto sin distinguir mayúsculas con su intercalación habitual, como hace _ci en MySQL.

  • SET NAMES utf8 from utf8mb4 tables

    se convierte, con una advertencia

    El mysqldump de MySQL 5.x escribe utf8 de 3 bytes por defecto y reemplaza cada emoji por un signo de interrogación antes de que cualquier convertidor vea el archivo.

    Línea del informe: dump_lost_four_byte_chars

  • dumps without SET NAMES whose text isn't UTF-8

    se lee como Latin-1 (Windows-1252)

    El latin1 de MySQL es Windows-1252, la codificación habitual de esos volcados.

    Línea del informe: charset_guessed

  • sjis, cp932, gbk, big5 dumps

    se lee como UTF-8, con una advertencia

    Estas codificaciones todavía no se decodifican.

    Línea del informe: unsupported_charset

  • UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rows

    se evalúan

    Algunas herramientas de volcado escriben los valores como estas llamadas; se leen como los valores que producen, con el WKT geográfico convertido para que la longitud vaya primero.

  • other expressions in rows

    NULL

    Un convertidor que no ejecuta una base de datos no puede evaluarlas.

    Línea del informe: expression_value

  • DEFAULT in VALUES

    el valor predeterminado de la columna

    Un valor predeterminado literal se copia en la fila.

    Línea del informe: default_keyword_filled

  • DEFAULT in VALUES without a literal default

    NULL

    No hay ningún valor que copiar.

    Línea del informe: default_keyword_null

  • REPLACE and INSERT IGNORE

    filas simples

    Un volcado tiene una fila por clave, así que las filas son las mismas.

    Línea del informe: replace_as_insert

  • types IntoSQL doesn't know

    nvarchar(max)

    El texto admite cualquier valor; cambia el tipo después de cargar.

    Línea del informe: unknown_type

  • values that don't fit their column

    NULL

    Un volcado dañado o escrito a mano puede contener valores que su columna no admite; se vuelven NULL para que se cargue el resto.

    Línea del informe: invalid_value_null

  • unreadable geometries

    NULL

    Los bytes que no son una geometría no se pueden guardar como una.

    Línea del informe: bad_geometry

  • CREATE SEQUENCE (MariaDB)

    CREATE SEQUENCE ... AS bigint, con su siguiente valor

    SQL Server tiene secuencias con las mismas opciones; cada una sigue donde la dejó el volcado.

  • VECTOR(n) (MariaDB 11.7+)

    nvarchar(max) con los números de punto flotante como arreglo JSON

    Solo SQL Server 2025 tiene un tipo vector; un arreglo JSON conserva cada número en todas las versiones.

    Línea del informe: type_replaced

En MySQLEn SQL ServerLínea del informe
TINYINT(1), BOOLbit cuando cada valor es 0 o 1, si no smallintEl BOOL de MySQL es un TINYINT(1) que puede contener cualquier número de -128 a 127. Una columna que solo contiene 0 y 1 se vuelve bit; una que contiene 2 o -1 sigue siendo un número para que ningún valor cambie de significado.bool_kept_numeric
UNSIGNED integersTINYINT 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)SQL Server no tiene enteros sin signo salvo tinyint, que va de 0 a 255. Un tipo más amplio contiene todo el rango sin signo, y el CHECK deja fuera los valores negativos como hacía MySQL.unsigned_widened
ZEROFILL and display widthsse descartaEl relleno con ceros es una forma de mostrar un número, no parte de él. Los números se conservan; dales formato al leerlos si el relleno importa.zerofill_dropped
FLOAT(M,D)real o float, sin la escalaLos números de punto flotante de SQL Server no tienen escala fija. Los valores guardados se copian tal cual.float_scale_dropped
DECIMAL(p,s)decimal(p,s) hasta 38 dígitos; nvarchar si son másEl decimal de SQL Server admite 38 dígitos. Los decimales más anchos se guardan como texto para que cada dígito siga exacto.decimal_as_text
BIT(1), BIT(n)bit; bigint hasta 63 bits; decimal(20,0) para BIT(64)Un solo bit es un sí o un no; los campos de bits más anchos se guardan como el número que forman sus bits.
zero, partial or impossible dates (0000-00-00, 2024-02-30)NULLSQL Server solo guarda fechas reales del calendario. MySQL conserva fechas cero e imposibles cuando su modo SQL lo permite; se vuelven NULL y el informe las cuenta.invalid_date_null
NOT NULL columns with values that become NULLsin NOT NULLUna columna cuyos valores tuvieron que volverse NULL no puede conservar NOT NULL, o la carga se detendría.not_null_relaxed
DEFAULT '0000-00-00'sin valor predeterminadoUn valor predeterminado que SQL Server no puede guardar se deja fuera en lugar de reemplazarse por una fecha inventada.zero_date_default
TIMEtime cuando cada valor cabe en un día, si no nvarcharEl TIME de MySQL es una duración de -838:59:59 a 838:59:59; el time de SQL Server es una hora del día. Una columna con valores más largos o negativos los conserva como texto.time_as_interval
YEARsmallint con un CHECK de su rangoSQL Server no tiene un tipo para años; el CHECK conserva los mismos valores que MySQL permite.
CHAR(n), VARCHAR(n)nvarchar(n)nvarchar admite cualquier carácter en cada versión compatible, y MySQL devuelve los valores CHAR sin espacios finales, como los conserva nvarchar.
text with characters past U+FFFF (emoji) in VARCHAR(n)nvarchar(2n), o nvarchar(max) a partir de 4000nvarchar cuenta unidades UTF-16 y un emoji ocupa dos, así que la columna tiene espacio para cada valor.text_length_widened
DATETIMEdatetime2Un DATETIME es una lectura de reloj sin zona horaria, como datetime2.
TIMESTAMPdatetimeoffset en la zona horaria que indica el volcado, UTC si no indica ningunaUn TIMESTAMP es un instante. Los volcados indican la zona en que lo escribieron (mysqldump escribe UTC); si no la indican, los valores se leen como UTC y el informe lo dice.timestamp_zone_assumed
ENUMnvarchar con un CHECK de sus valoresEl texto con un CHECK conserva los mismos valores.
ENUM holding '' (MySQL's error value)el valor vacío, que el CHECK admiteMySQL guarda una cadena vacía cuando un valor no válido entra en un ENUM en un modo SQL permisivo. Esas filas se conservan y el CHECK las admite.enum_invalid_value
ENUM holding values outside its listsin CHECKLos valores que la lista no nombra no cumplirían el CHECK, así que el CHECK no se crea.enum_check_skipped
SETnvarchar tal como lo escribe MySQL ('a,b')SQL Server no tiene arreglos; el texto es el que devuelve MySQL.
JSONnvarchar(max)Las funciones JSON de SQL Server leen JSON desde texto. Un CHECK con ISJSON rechazaría valores escalares como 1 o "x" antes de SQL Server 2022, que MySQL conserva.
NUL bytes in textse conservanvarchar puede contener un carácter NUL, así que el valor se copia tal cual.
text that isn't valid in its character setlos bytes incorrectos como carácter de reemplazoEl texto tiene que leerse como caracteres para escribirse como nvarchar.invalid_utf8_replaced
text decoded twice (ñ)se copia tal cualEl volcado contiene exactamente estos caracteres, así que se copian; el informe los señala.mojibake_suspected
AUTO_INCREMENTIDENTITY, con el contador después de los ids copiadosLos ids copiados se cargan con IDENTITY_INSERT, y el contador sigue después del más alto o del AUTO_INCREMENT del volcado, el que sea mayor.
MyISAM AUTO_INCREMENT on the second column of a keyun contador para la tablaMyISAM cuenta por grupo de la primera columna de la clave; SQL Server tiene un contador por tabla.myisam_group_autoincrement
ON UPDATE CURRENT_TIMESTAMPun disparador AFTER UPDATEEl disparador pone la hora actual en la columna cuando una actualización no la asigna. Se une por la clave primaria, así que la tabla necesita una.on_update_trigger
ON UPDATE CURRENT_TIMESTAMP on a table without a primary keyno se trasladaEl disparador encuentra las filas actualizadas por su clave primaria; sin una, no puede.on_update_without_key
generated columnscolumnas calculadas, PERSISTED cuando el origen las guardaSQL Server las calcula de las mismas dos formas.
generated columns with functions SQL Server lacksuna columna simpleUna fórmula que no se puede escribir para SQL Server deja una columna simple y una línea en el informe.generated_not_translated
INVISIBLE columnscolumnas normalesSQL Server no tiene columnas invisibles.invisible_column
CHECK constraintstraducido, en línea en CREATE TABLELos CHECK en línea se comprueban al cargar cada fila.
CHECK constraints with functions SQL Server lacksno se creaUn CHECK que no se puede escribir para SQL Server se deja fuera y aparece en el informe.check_skipped
CHECK ... NOT ENFORCEDno se creaMySQL conserva estos CHECK sin aplicarlos, así que las filas pueden no cumplirlos.check_not_enforced
defaults with functions SQL Server lackssin valor predeterminadoUn valor predeterminado que no se puede escribir para SQL Server se deja fuera y aparece en el informe.default_not_translated
keys and indexes on a prefix, c(20)un índice sobre la columna completaSQL Server indexa columnas completas; una clave única sobre un prefijo también es única sobre la columna completa, así que cada fila carga.prefix_whole_column
FULLTEXT indexesno se creaLa búsqueda de texto completo de SQL Server necesita un catálogo y sus propias consultas.fulltext_not_created
SPATIAL indexesno se creaUn índice espacial sobre una columna de geometría necesita un cuadro delimitador que el volcado no indica.spatial_index_not_created
functional indexes, and indexes on columns of unlimited lengthno se creaSQL Server no indexa expresiones ni columnas nvarchar(max) y varbinary(max).index_skipped
foreign keysdespués de los datos, WITH NOCHECK, luego comprobada con una advertencia si hay huérfanasLos volcados se cargan con FOREIGN_KEY_CHECKS=0 y MyISAM nunca comprueba, así que las filas sin padre son comunes. La clave se crea primero y se comprueba al final; las filas huérfanas la dejan sin comprobar con una advertencia en lugar de detener la carga.
ON DELETE or ON UPDATE that cascades in a cycle or along a second pathNO ACTIONSQL Server rechaza las propagaciones que podrían llegar dos veces a una tabla; MySQL las permite.foreign_key_action_dropped
foreign keys to columns without a unique keyno se creaSQL Server necesita una clave primaria o un índice único sin NULL en las columnas referenciadas; InnoDB no.foreign_key_skipped
table and column namestal como están escritos; renombrados cuando solo difieren en mayúsculasLos nombres de SQL Server no distinguen mayúsculas con la intercalación habitual.identifier_renamed
names over 116 charactersacortadoLos nombres de SQL Server admiten 128 caracteres, algunos para los números que mantienen distintos los nombres.name_shortened
GEOMETRY, POINT, POLYGON...geometry, con el SRID de cada valorEl tipo geometry propio de SQL Server conserva cada forma y su sistema de referencia espacial.
INET4, INET6, UUID (MariaDB)nvarchar(39), uniqueidentifieruniqueidentifier es el UUID de SQL Server; las direcciones se guardan como texto.
BINARY, VARBINARY, BLOBbinary, varbinary, varbinary(max)Los bytes siguen siendo bytes.
PARTITION BYuna sola tablaLas filas son las mismas; vuelve a particionar la tabla en SQL Server si lo necesita.partitions_dropped
WITH SYSTEM VERSIONING (MariaDB)una tabla con las filas actualesUn volcado solo contiene las filas actuales.system_versioning_dropped
MyISAM, MEMORY and other enginesuna tabla normalSQL Server tiene un solo motor de tablas.engine_dropped
views, triggers, procedures, functions and eventslistados en el informeSu código está escrito en el lenguaje de MySQL, así que se listan para que los vuelvas a crear.not_converted_objects
dumps without CREATE TABLEtipos leídos de los valoresUn volcado hecho con --no-create-info solo tiene filas, así que los tipos salen de los valores.no_schema
geometries in a dump without CREATE TABLEgeometryEl formato de geometría de MySQL se reconoce por los valores.
_ci collationsla intercalación de la base de datos, normalmente sin distinguir mayúsculasSQL Server compara el texto sin distinguir mayúsculas con su intercalación habitual, como hace _ci en MySQL.
SET NAMES utf8 from utf8mb4 tablesse convierte, con una advertenciaEl mysqldump de MySQL 5.x escribe utf8 de 3 bytes por defecto y reemplaza cada emoji por un signo de interrogación antes de que cualquier convertidor vea el archivo.dump_lost_four_byte_chars
dumps without SET NAMES whose text isn't UTF-8se lee como Latin-1 (Windows-1252)El latin1 de MySQL es Windows-1252, la codificación habitual de esos volcados.charset_guessed
sjis, cp932, gbk, big5 dumpsse lee como UTF-8, con una advertenciaEstas codificaciones todavía no se decodifican.unsupported_charset
UNHEX('..'), CONVERT(b'..', UNSIGNED), CONVERT(".." USING x), ST_GeomFromText('..') in rowsse evalúanAlgunas herramientas de volcado escriben los valores como estas llamadas; se leen como los valores que producen, con el WKT geográfico convertido para que la longitud vaya primero.
other expressions in rowsNULLUn convertidor que no ejecuta una base de datos no puede evaluarlas.expression_value
DEFAULT in VALUESel valor predeterminado de la columnaUn valor predeterminado literal se copia en la fila.default_keyword_filled
DEFAULT in VALUES without a literal defaultNULLNo hay ningún valor que copiar.default_keyword_null
REPLACE and INSERT IGNOREfilas simplesUn volcado tiene una fila por clave, así que las filas son las mismas.replace_as_insert
types IntoSQL doesn't knownvarchar(max)El texto admite cualquier valor; cambia el tipo después de cargar.unknown_type
values that don't fit their columnNULLUn volcado dañado o escrito a mano puede contener valores que su columna no admite; se vuelven NULL para que se cargue el resto.invalid_value_null
unreadable geometriesNULLLos bytes que no son una geometría no se pueden guardar como una.bad_geometry
CREATE SEQUENCE (MariaDB)CREATE SEQUENCE ... AS bigint, con su siguiente valorSQL Server tiene secuencias con las mismas opciones; cada una sigue donde la dejó el volcado.
VECTOR(n) (MariaDB 11.7+)nvarchar(max) con los números de punto flotante como arreglo JSONSolo SQL Server 2025 tiene un tipo vector; un arreglo JSON conserva cada número en todas las versiones.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.

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

¿No encuentras la respuesta? Escríbenos desde la página de contacto y te responde una persona. Página de contacto

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