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.
18 filas convertidas, 10 correcciones, ninguna rechazada
Tablas en shop_2024.sqlVolcado de MySQL 8.0.46 · escrito por mysqldump · utf8mb4
customers8 filas4
7 columnas id bigint not null name nvarchar(200) not null email nvarchar(150) not null country nvarchar(2) not null is_active bit not null signed_up date created_at datetimeoffset(0) not null orders10 filas6
9 columnas id bigint not null customer_id bigint not null status nvarchar(9) not null total decimal(10,2) not null items int not null ordered_at datetime2(0) not null shipped_at datetime2(0) note nvarchar(510) updated_at datetimeoffset(0) not null
-- Written by IntoSQL from a MySQL dump. Load it with: sqlcmd -b -f 65001 -d <database> -i <file>
SET NOCOUNT ON;
SET ANSI_NULLS ON;
SET QUOTED_IDENTIFIER ON;
SET ANSI_PADDING ON;
SET ANSI_WARNINGS ON;
SET ARITHABORT ON;
SET CONCAT_NULL_YIELDS_NULL ON;
SET NUMERIC_ROUNDABORT OFF;
GO
CREATE 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
- "id" de customers no tiene signo, así que se volvió bigint con un CHECK de que no sea negativa.
- "name" de customers contiene caracteres que SQL Server cuenta dos veces, como los emoji, así que es nvarchar(200).
- "signed_up" de customers ahora admite NULL: algunos de sus valores no se pudieron guardar y quedan en NULL.
- 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.
- "customer_id" de orders no tiene signo, así que se volvió bigint con un CHECK de que no sea negativa.
- "id" de orders no tiene signo, así que se volvió bigint con un CHECK de que no sea negativa.
- "items" de orders no tiene signo, así que se volvió int con un CHECK de que no sea negativa.
- "note" de orders contiene caracteres que SQL Server cuenta dos veces, como los emoji, así que es nvarchar(510).
- 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.
- "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 MySQL | En SQL Server | Línea del informe |
|---|---|---|
| TINYINT(1), BOOL | bit 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 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. | unsigned_widened |
| ZEROFILL and display widths | se 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 NULL | sin 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 |
| TIME | time 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 |
| YEAR | smallint 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 |
| DATETIME | datetime2Un 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 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 |
| ENUM | nvarchar 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 list | sin CHECKLos valores que la lista no nombra no cumplirían el CHECK, así que el CHECK no se crea. | 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 conservanvarchar 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 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_INCREMENT | IDENTITY, 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 key | un 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_TIMESTAMP | un 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 key | no se trasladaEl disparador encuentra las filas actualizadas por su clave primaria; sin una, no puede. | on_update_without_key |
| generated columns | columnas calculadas, PERSISTED cuando el origen las guardaSQL Server las calcula de las mismas dos formas. | |
| generated columns with functions SQL Server lacks | una 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 columns | columnas normalesSQL Server no tiene columnas invisibles. | invisible_column |
| CHECK constraints | traducido, en línea en CREATE TABLELos CHECK en línea se comprueban al cargar cada fila. | |
| CHECK constraints with functions SQL Server lacks | no se creaUn CHECK que no se puede escribir para SQL Server se deja fuera y aparece en el informe. | check_skipped |
| CHECK ... NOT ENFORCED | no se creaMySQL conserva estos CHECK sin aplicarlos, así que las filas pueden no cumplirlos. | check_not_enforced |
| defaults with functions SQL Server lacks | sin 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 indexes | no se creaLa búsqueda de texto completo de SQL Server necesita un catálogo y sus propias consultas. | fulltext_not_created |
| SPATIAL indexes | no 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 length | no se creaSQL Server no indexa expresiones ni columnas nvarchar(max) y varbinary(max). | index_skipped |
| foreign keys | despué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 path | NO 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 key | no 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 names | tal 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 characters | acortadoLos 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, BLOB | binary, varbinary, varbinary(max)Los bytes siguen siendo bytes. | |
| PARTITION BY | una 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 engines | una tabla normalSQL Server tiene un solo motor de tablas. | engine_dropped |
| views, triggers, procedures, functions and events | listados 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 TABLE | tipos 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 TABLE | geometryEl 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úsculasSQL 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 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-8 | se 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 dumps | se 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 rows | se 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 rows | NULLUn convertidor que no ejecuta una base de datos no puede evaluarlas. | expression_value |
| DEFAULT in VALUES | el valor predeterminado de la columnaUn valor predeterminado literal se copia en la fila. | default_keyword_filled |
| DEFAULT in VALUES without a literal default | NULLNo hay ningún valor que copiar. | default_keyword_null |
| REPLACE and INSERT IGNORE | filas simplesUn volcado tiene una fila por clave, así que las filas son las mismas. | replace_as_insert |
| types IntoSQL doesn't know | nvarchar(max)El texto admite cualquier valor; cambia el tipo después de cargar. | unknown_type |
| values that don't fit their column | NULLUn 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 geometries | NULLLos 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.sqlLas 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.