Convierte SQL Server a MySQL
Suelta el script que escribe Generate Scripts de SSMS con esquema y datos, en .sql o .sql.gz, UTF-16 o UTF-8, y descarga un script de MySQL con las mismas tablas, claves, índices y datos. Cada valor que MySQL no puede guardar tal cual, y cada objeto que no admite, aparece en el informe.
18 filas convertidas, 3 correcciones, ninguna rechazada
Tablas en shop_2024_sqlserver.sqlVolcado de SQL Server · escrito por SQL Server Management Objects · utf-8
orders10 filas1
11 columnas id int not null customer_id int not null status varchar(10) not null total decimal(19,4) not null items tinyint unsigned not null ordered_at datetime not null shipped_at datetime(6) note text details text order_ref char(36) not null total_with_tax decimal(12,2) customers8 filas2
8 columnas id int not null name varchar(100) not null email varchar(200) not null country char(2) not null is_active tinyint(1) not null signed_up date created_at datetime not null row_version blob
Sin convertir
- Vista paid_orders
- Disparador orders_no_negative
Cada base de datos los escribe en su propio lenguaje. Reescríbelos para MySQL.
-- Written by IntoSQL from a SQL Server dump. Load it with: mysql --default-character-set=utf8mb4 <database> < <file>
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
SET UNIQUE_CHECKS = 0;
SET SQL_MODE = 'NO_AUTO_VALUE_ON_ZERO,ALLOW_INVALID_DATES';
CREATE TABLE `orders` (
`id` int NOT NULL AUTO_INCREMENT,
`customer_id` int NOT NULL,
`status` varchar(10) NOT NULL DEFAULT 'pending',
`total` decimal(19,4) NOT NULL,
`items` tinyint unsigned NOT NULL DEFAULT 1,
`ordered_at` datetime NOT NULL,
`shipped_at` datetime(6),
`note` text,
`details` text,
`order_ref` char(36) NOT NULL,
`total_with_tax` decimal(12,2) GENERATED ALWAYS AS (cast(`total` * (1.16) AS DECIMAL(12,2))) STORED,
PRIMARY KEY (`id`),
KEY `idx_orders_customer` (`customer_id`),
KEY `idx_orders_status_date` (`status`,`ordered_at`),
CONSTRAINT `check2` CHECK (`status` = 'cancelled' OR `status` = 'shipped' OR `status` = 'paid' OR `status` = 'pending'),
CONSTRAINT `check3` CHECK (`total` >= (0)),
FOREIGN KEY (`customer_id`) REFERENCES `customers` (`id`)
) AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
CREATE TABLE `customers` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
`email` varchar(200) NOT NULL,
`country` char(2) NOT NULL DEFAULT 'US',
`is_active` tinyint(1) NOT NULL DEFAULT 1,
`signed_up` date,
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`row_version` blob,
PRIMARY KEY (`id`),
UNIQUE KEY (`email`)
) AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='People who bought at least once';
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (1,'Ana Martínez','ana@example.com','MX',1,'2023-01-15','2023-01-15 10:24:00.000000');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (2,'Zoë Müller','zoe@example.de','DE',1,'2023-02-03','2023-02-03 08:11:42.000000');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (3,'José Peña','jose@example.es','ES',0,'2023-03-21','2023-03-21 19:05:17.000000');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (4,'李雷','lilei@example.cn','CN',1,'2023-05-09','2023-05-09 02:40:00.000000');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (5,'Noah O\'Brien','noah@example.ie','IE',1,NULL,'2023-06-30 14:00:00.000000');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (6,'Amélie Laurent','amelie@example.fr','FR',1,'2024-01-02','2024-01-02 09:30:00.000000');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (7,'Ravi Patel','ravi@example.in','IN',0,'2024-02-29','2024-02-29 23:59:59.000000');
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`signed_up`,`created_at`) VALUES (8,'Sofia Rossi 🌻','sofia@example.it','IT',1,'2024-04-12','2024-04-12 12:12:12.000000');
INSERT INTO `orders` (`id`,`customer_id`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`,`details`,`order_ref`) VALUES (1,1,'shipped',129.9000,3,'2024-03-01T10:00:00.000000','2024-03-02T16:30:00.123456',NULL,'{"gift": false}','0b7a4c2e-3f1d-4e8a-9c55-1a2b3c4d5e6f');
INSERT INTO `orders` (`id`,`customer_id`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`,`details`,`order_ref`) VALUES (2,2,'paid',54.0000,1,'2024-03-02T11:15:00.000000',NULL,'Gift wrap 🎁','{"gift": true, "wrap": "red"}','1c8b5d3f-4a2e-4f9b-8d66-2b3c4d5e6f70');
INSERT INTO `orders` (`id`,`customer_id`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`,`details`,`order_ref`) VALUES (3,1,'cancelled',12.5000,1,'2024-03-03T09:45:00.000000',NULL,'Customer changed their mind',NULL,'2d9c6e4a-5b3f-4a0c-9e77-3c4d5e6f7081');
INSERT INTO `orders` (`id`,`customer_id`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`,`details`,`order_ref`) VALUES (4,4,'shipped',980.0000,12,'2024-03-05T02:10:00.000000','2024-03-07T08:00:00.000000','请小心轻放','{"fragile": true}','3e0d7f5b-6c4a-4b1d-8f88-4d5e6f708192');
INSERT INTO `orders` (`id`,`customer_id`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`,`details`,`order_ref`) VALUES (5,5,'pending',45.7500,2,'2024-03-08T17:20:00.000000',NULL,'Leave at the door; ring twice',NULL,'4f1e806c-7d5b-4c2e-9a99-5e6f708192a3');
INSERT INTO `orders` (`id`,`customer_id`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`,`details`,`order_ref`) VALUES (6,6,'shipped',310.4000,5,'2024-03-10T13:00:00.000000','2024-03-11T09:00:00.000000','Fragile: "glass"','{"fragile": true}','50f2917d-8e6c-4d3f-8baa-6f708192a3b4');
INSERT INTO `orders` (`id`,`customer_id`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`,`details`,`order_ref`) VALUES (7,8,'paid',76.2000,2,'2024-03-11T18:45:00.000000',NULL,NULL,NULL,'6103a28e-9f7d-4e40-9cbb-708192a3b4c5');
INSERT INTO `orders` (`id`,`customer_id`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`,`details`,`order_ref`) VALUES (8,2,'shipped',19.9900,1,'2024-03-12T08:00:00.000000','9999-12-31T23:59:59.999999','Shipped date set to the maximum by an old import',NULL,'7214b39f-a08e-4f51-8dcc-8192a3b4c5d6');
INSERT INTO `orders` (`id`,`customer_id`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`,`details`,`order_ref`) VALUES (9,3,'shipped',64.0000,2,'2024-03-14T15:30:00.000000','2024-03-15T10:00:00.000000','Two parcels','{"parcels": [1, 2]}','8325c4a0-b19f-4062-9edd-92a3b4c5d6e7');
INSERT INTO `orders` (`id`,`customer_id`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`,`details`,`order_ref`) VALUES (10,7,'paid',1499.0000,1,'2024-03-15T21:05:00.000000',NULL,'C:\\Users\\ravi\\invoice.pdf',NULL,'9436d5b1-c2a0-4173-8fee-a3b4c5d6e7f8');
SET UNIQUE_CHECKS = 1;
SET FOREIGN_KEY_CHECKS = 1;
Correcciones
- "shipped_at" de orders es datetime2(7), con más dígitos de segundo de los que guarda MySQL, así que es datetime(6) y se cortan los últimos dígitos.
- "created_at" de customers contiene instantes con zona horaria; MySQL no tiene un tipo que la conserve, así que se guardan en UTC como datetime.
- "row_version" de customers es una versión de fila que SQL Server asigna por sí mismo; el volcado no tiene valores para ella, así que es blob y queda vacía.
Para revisar
- 6 columnas de texto comparan sin distinguir mayúsculas en el origen; MySQL compara exactamente, así que las claves únicas y las búsquedas pueden comportarse distinto. Usa una intercalación o un tipo de columna que no distinga mayúsculas en las columnas que lo necesiten.
- 2 vistas, disparadores, rutinas o eventos no se convierten; el informe lista cada uno. Vuelve a crearlos a mano en MySQL.
- El CHECK check1 de orders no se puede escribir para MySQL (function isjson), así que no se crea. Escribe el CHECK a mano si es importante.
- El índice idx_orders_pending de orders usa una expresión que no se puede escribir para MySQL (neither MySQL 5.7 nor MariaDB index an expression), así que no se crea. Crea el índice a mano si las consultas lo necesitan.
- El valor predeterminado de "order_ref" en orders no se puede escribir para MySQL (a default expression needs MySQL 8.0.13), así que la columna no tiene valor predeterminado. Agrega el valor predeterminado a mano si las filas nuevas lo necesitan.
Tu archivo se convierte en esta computadora y nunca se sube.
Otros ejemplos:
Qué cambia de SQL Server a MySQL
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.
bit
tinyint(1)
El BOOLEAN de MySQL es TINYINT(1): 1 y 0, como los guarda bit.
char(n), varchar(n), nchar(n), nvarchar(n), varchar(max), text
char(n), varchar(n) hasta 1024 caracteres, tipos text si son más
El texto conserva cada carácter como utf8mb4. Una columna en una clave es varchar(768) como máximo, lo más largo que admite una clave, y también lo es el texto con un valor predeterminado, que MySQL 5.7 solo da a varchar.
decimal(p,s), money, smallmoney
decimal(p,s); money como decimal(19,4)
decimal admite 65 dígitos, más que los 38 de SQL Server, así que cada valor es exacto.
datetime, datetime2, smalldatetime
datetime(p)
Un datetime es una lectura de reloj en ambos.
datetime2(7), time(7) and datetimeoffset(7)
seis dígitos de segundo, el séptimo se corta
MySQL guarda microsegundos; el séptimo dígito (100 nanosegundos) se corta, nunca se redondea, así que ningún valor pasa al segundo o al día siguiente.
Línea del informe: fraction_cut
datetimeoffset
datetime(p) en UTC
El TIMESTAMP de MySQL solo llega a 2038, así que los instantes se guardan como datetime en UTC, el mismo instante sea cual sea el desfase que tenía cada valor.
Línea del informe: moments_as_utc
time
time(p)
Las mismas horas del día.
dates before the year 1000
NULL
MySQL guarda los años 1000 a 9999, y SQL Server llega hasta el año 1. Esos valores se vuelven NULL y el informe los cuenta.
Línea del informe: date_out_of_range
json (SQL Server 2025)
json
Los mismos valores JSON, que leen las funciones JSON de MySQL.
uniqueidentifier
char(36)
Los mismos identificadores, escritos en minúsculas.
binary, varbinary, image
binary(n), varbinary(n) y tipos blob
Los bytes siguen siendo bytes.
geometry, geography
blob con los bytes propios de SQL Server
SSMS escribe los valores espaciales en la serialización de SQL Server, que se conserva byte a byte.
Línea del informe: spatial_as_native
rowversion, timestamp
blob, sin valores
SQL Server asigna la versión de fila por sí mismo y SSMS no escribe valores para ella en el script.
Línea del informe: rowversion_empty
xml, sql_variant, hierarchyid, vector
longtext
MySQL no tiene un tipo equivalente; xml y sql_variant conservan el texto de cada valor y hierarchyid su ruta, como /1/2/.
Línea del informe: type_replaced
collations that ignore case (_CI_)
comparación exacta (utf8mb4_bin)
Las tablas usan utf8mb4_bin para que las claves únicas mantengan distinto lo que SQL Server mantenía distinto; las columnas que no distinguían mayúsculas pierden eso. Las reglas de acentos cambian entre versiones, así que ninguna intercalación _ci coincide con la de SQL Server en todas.
Línea del informe: case_insensitive_collation
IDENTITY
AUTO_INCREMENT, siguiendo después del id más alto
Cuenta la columna que encabeza la clave primaria; el contador sigue después del id más alto.
IDENTITY columns that don't lead the primary key
un entero simple
MySQL cuenta una columna por tabla, al inicio de una clave; cualquier otra conserva sus valores sin contador.
Línea del informe: counter_dropped
CREATE SEQUENCE
no se crea
MySQL no tiene secuencias. Los valores que entregó una secuencia están en las filas.
Línea del informe: sequence_not_converted
computed columns
columnas generadas, STORED cuando son PERSISTED, VIRTUAL en otro caso
MySQL las calcula de las mismas dos formas, con CONCAT escrito para que NULL cuente como vacío, como en SQL Server.
computed columns with functions MySQL lacks
una columna simple
Una fórmula que no se puede escribir deja una columna simple y una línea en el informe; SSMS no escribe valores para las columnas calculadas.
Línea del informe: generated_not_translated
defaults with functions MySQL lacks, and NEXT VALUE FOR
sin valor predeterminado
Un valor predeterminado que no se puede escribir se deja fuera y aparece en el informe.
Línea del informe: default_not_translated
CHECK constraints
traducidos
MySQL 5.7 los conserva sin comprobarlos; las demás versiones los comprueban al cargar cada fila.
CHECK constraints with functions MySQL lacks
no se crea
Un CHECK que no se puede escribir se deja fuera y aparece en el informe.
Línea del informe: check_skipped
CHECK constraints added WITH NOCHECK or disabled
no se crea
SQL Server no aplica estos CHECK, así que las filas pueden no cumplirlos.
Línea del informe: check_not_enforced
filtered and columnstore indexes
no se crea
IntoSQL escribe índices b-tree sobre columnas completas; vuelve a crear los demás después de cargar.
Línea del informe: index_skipped
foreign keys
claves foráneas, cargadas con FOREIGN_KEY_CHECKS=0
Las filas cargan en cualquier orden, y después las claves comprueban las filas nuevas.
foreign keys to tables the dump doesn't create
no se crea
Una clave no puede nombrar una tabla que no existe.
Línea del informe: foreign_key_skipped
tables on a partition scheme
una tabla con las filas de todas las particiones
Las filas son las mismas; vuelve a particionar la tabla en MySQL si lo necesita.
Línea del informe: partitions_dropped
temporal tables (SYSTEM_VERSIONING)
dos tablas: las filas actuales y el historial
La tabla y su tabla de historial se copian como tablas simples; MySQL no conserva el historial por sí mismo.
Línea del informe: system_versioning_dropped
schemas
una base de datos, con el nombre del esquema delante de cada tabla
Los esquemas de MySQL son bases de datos, que un script cargado en una sola base de datos no puede crear; las tablas de dbo conservan sus nombres.
Línea del informe: schemas_merged
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
views, functions, procedures, triggers, synonyms, types and partition functions
listados en el informe
Su código está escrito en T-SQL, así que se listan para que los vuelvas a crear.
Línea del informe: not_converted_objects
scripts without CREATE TABLE (data only)
tipos leídos de los valores
Un script solo de datos solo tiene filas, así que los tipos salen de los valores.
Línea del informe: no_schema
expressions in INSERT values
NULL
Un convertidor que no ejecuta una base de datos no puede evaluarlas.
Línea del informe: expression_value
types IntoSQL doesn't know
longtext
El texto admite cualquier valor; cambia el tipo después de cargar.
Línea del informe: unknown_type
NUL characters in text
se conserva
El valor se copia con el carácter NUL escapado.
text that isn't valid in its encoding
los bytes incorrectos como carácter de reemplazo
El script es UTF-8 y cada valor tiene que ser texto válido.
Línea del informe: invalid_utf8_replaced
text decoded twice (ñ)
se copia tal cual
El script contiene exactamente estos caracteres, así que se copian; el informe los señala.
Línea del informe: mojibake_suspected
| En SQL Server | En MySQL | Línea del informe |
|---|---|---|
| bit | tinyint(1)El BOOLEAN de MySQL es TINYINT(1): 1 y 0, como los guarda bit. | |
| char(n), varchar(n), nchar(n), nvarchar(n), varchar(max), text | char(n), varchar(n) hasta 1024 caracteres, tipos text si son másEl texto conserva cada carácter como utf8mb4. Una columna en una clave es varchar(768) como máximo, lo más largo que admite una clave, y también lo es el texto con un valor predeterminado, que MySQL 5.7 solo da a varchar. | |
| decimal(p,s), money, smallmoney | decimal(p,s); money como decimal(19,4)decimal admite 65 dígitos, más que los 38 de SQL Server, así que cada valor es exacto. | |
| datetime, datetime2, smalldatetime | datetime(p)Un datetime es una lectura de reloj en ambos. | |
| datetime2(7), time(7) and datetimeoffset(7) | seis dígitos de segundo, el séptimo se cortaMySQL guarda microsegundos; el séptimo dígito (100 nanosegundos) se corta, nunca se redondea, así que ningún valor pasa al segundo o al día siguiente. | fraction_cut |
| datetimeoffset | datetime(p) en UTCEl TIMESTAMP de MySQL solo llega a 2038, así que los instantes se guardan como datetime en UTC, el mismo instante sea cual sea el desfase que tenía cada valor. | moments_as_utc |
| time | time(p)Las mismas horas del día. | |
| dates before the year 1000 | NULLMySQL guarda los años 1000 a 9999, y SQL Server llega hasta el año 1. Esos valores se vuelven NULL y el informe los cuenta. | date_out_of_range |
| json (SQL Server 2025) | jsonLos mismos valores JSON, que leen las funciones JSON de MySQL. | |
| uniqueidentifier | char(36)Los mismos identificadores, escritos en minúsculas. | |
| binary, varbinary, image | binary(n), varbinary(n) y tipos blobLos bytes siguen siendo bytes. | |
| geometry, geography | blob con los bytes propios de SQL ServerSSMS escribe los valores espaciales en la serialización de SQL Server, que se conserva byte a byte. | spatial_as_native |
| rowversion, timestamp | blob, sin valoresSQL Server asigna la versión de fila por sí mismo y SSMS no escribe valores para ella en el script. | rowversion_empty |
| xml, sql_variant, hierarchyid, vector | longtextMySQL no tiene un tipo equivalente; xml y sql_variant conservan el texto de cada valor y hierarchyid su ruta, como /1/2/. | type_replaced |
| collations that ignore case (_CI_) | comparación exacta (utf8mb4_bin)Las tablas usan utf8mb4_bin para que las claves únicas mantengan distinto lo que SQL Server mantenía distinto; las columnas que no distinguían mayúsculas pierden eso. Las reglas de acentos cambian entre versiones, así que ninguna intercalación _ci coincide con la de SQL Server en todas. | case_insensitive_collation |
| IDENTITY | AUTO_INCREMENT, siguiendo después del id más altoCuenta la columna que encabeza la clave primaria; el contador sigue después del id más alto. | |
| IDENTITY columns that don't lead the primary key | un entero simpleMySQL cuenta una columna por tabla, al inicio de una clave; cualquier otra conserva sus valores sin contador. | counter_dropped |
| CREATE SEQUENCE | no se creaMySQL no tiene secuencias. Los valores que entregó una secuencia están en las filas. | sequence_not_converted |
| computed columns | columnas generadas, STORED cuando son PERSISTED, VIRTUAL en otro casoMySQL las calcula de las mismas dos formas, con CONCAT escrito para que NULL cuente como vacío, como en SQL Server. | |
| computed columns with functions MySQL lacks | una columna simpleUna fórmula que no se puede escribir deja una columna simple y una línea en el informe; SSMS no escribe valores para las columnas calculadas. | generated_not_translated |
| defaults with functions MySQL lacks, and NEXT VALUE FOR | sin valor predeterminadoUn valor predeterminado que no se puede escribir se deja fuera y aparece en el informe. | default_not_translated |
| CHECK constraints | traducidosMySQL 5.7 los conserva sin comprobarlos; las demás versiones los comprueban al cargar cada fila. | |
| CHECK constraints with functions MySQL lacks | no se creaUn CHECK que no se puede escribir se deja fuera y aparece en el informe. | check_skipped |
| CHECK constraints added WITH NOCHECK or disabled | no se creaSQL Server no aplica estos CHECK, así que las filas pueden no cumplirlos. | check_not_enforced |
| filtered and columnstore indexes | no se creaIntoSQL escribe índices b-tree sobre columnas completas; vuelve a crear los demás después de cargar. | index_skipped |
| foreign keys | claves foráneas, cargadas con FOREIGN_KEY_CHECKS=0Las filas cargan en cualquier orden, y después las claves comprueban las filas nuevas. | |
| foreign keys to tables the dump doesn't create | no se creaUna clave no puede nombrar una tabla que no existe. | foreign_key_skipped |
| tables on a partition scheme | una tabla con las filas de todas las particionesLas filas son las mismas; vuelve a particionar la tabla en MySQL si lo necesita. | partitions_dropped |
| temporal tables (SYSTEM_VERSIONING) | dos tablas: las filas actuales y el historialLa tabla y su tabla de historial se copian como tablas simples; MySQL no conserva el historial por sí mismo. | system_versioning_dropped |
| schemas | una base de datos, con el nombre del esquema delante de cada tablaLos esquemas de MySQL son bases de datos, que un script cargado en una sola base de datos no puede crear; las tablas de dbo conservan sus nombres. | schemas_merged |
| 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 |
| views, functions, procedures, triggers, synonyms, types and partition functions | listados en el informeSu código está escrito en T-SQL, así que se listan para que los vuelvas a crear. | not_converted_objects |
| scripts without CREATE TABLE (data only) | tipos leídos de los valoresUn script solo de datos solo tiene filas, así que los tipos salen de los valores. | no_schema |
| expressions in INSERT values | NULLUn convertidor que no ejecuta una base de datos no puede evaluarlas. | expression_value |
| types IntoSQL doesn't know | longtextEl texto admite cualquier valor; cambia el tipo después de cargar. | unknown_type |
| NUL characters in text | se conservaEl valor se copia con el carácter NUL escapado. | |
| text that isn't valid in its encoding | los bytes incorrectos como carácter de reemplazoEl script es UTF-8 y cada valor tiene que ser texto válido. | invalid_utf8_replaced |
| text decoded twice (ñ) | se copia tal cualEl script contiene exactamente estos caracteres, así que se copian; el informe los señala. | mojibake_suspected |
Carga el script en MySQL
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.
mysql --default-character-set=utf8mb4 mydb < sql_server.mysql.sqlLas claves foráneas se crean como las declara el volcado, con FOREIGN_KEY_CHECKS=0 mientras cargan las filas, así que una fila que apunta a una fila que no existe no detiene la carga.
Para un volcado grande, ejecuta el cliente en la misma máquina que el servidor, y sube max_allowed_packet si una sola fila es muy grande.
IntoSQL Pro carga el archivo directo en MySQL desde la app de escritorio o la línea de comandos, sin escribir un script.
Haz el volcado de SQL Server para el mejor resultado
El convertidor lee lo que contiene el volcado. Estas opciones conservan más de tus datos en él:
- En SSMS, haz clic derecho en la base de datos, Tasks, Generate Scripts, y elige las tablas. dbatools, mssql-scripter y otras herramientas basadas en la misma biblioteca escriben el mismo script.
- En Advanced, cambia Types of data to script a Schema and data. Un script solo del esquema tiene tablas sin filas.
- Guárdalo como Unicode, el formato predeterminado de SSMS, o como UTF-8: ambos se leen igual, y gzip también funciona.
Qué no se convierte
Las vistas, funciones, procedimientos, disparadores, sinónimos, reglas y políticas de seguridad se escriben en T-SQL. Aparecen en el informe por nombre, nunca se descartan en silencio, para que puedas reescribirlos para MySQL.
Preguntas sobre SQL Server a MySQL
¿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 el archivo UTF-16 que guarda SSMS?
Sí. SSMS guarda los scripts en UTF-16 por defecto, y el convertidor lee UTF-16 y UTF-8 por igual, con gzip o sin él, con GO entre lotes.
¿De qué versiones de SQL Server puede venir el script?
Scripts que SSMS, dbatools o mssql-scripter escriben desde SQL Server 2017 en adelante. Cada script de prueba viene de SQL Server 2017, 2022 y 2025 y se compara con su origen celda por celda.
¿Se conservan los valores IDENTITY?
Sí, para una columna por tabla: la columna IDENTITY que encabeza la clave primaria se vuelve AUTO_INCREMENT y sigue después del id más alto. Las secuencias no se crean, porque MySQL no tiene, y el informe lo indica.
¿Qué pasa con money, datetimeoffset y otros tipos de SQL Server?
bit se vuelve tinyint(1), money decimal(19,4), uniqueidentifier char(36) y datetimeoffset datetime en UTC. Los esquemas se vuelven prefijos del nombre de tabla en una sola base de datos. Las columnas que no distinguían mayúsculas se comparan exactamente, y el informe dice cuáles.
¿Qué pasa con los procedimientos, los disparadores y las vistas?
Aparecen en el informe por nombre y no se convierten, porque cada base de datos los escribe en su propio lenguaje.
¿En qué versiones de MySQL carga el script?
MySQL 5.7 y posteriores. Cada script de prueba carga en 5.7 y 9, y se detiene en el primer error si algo sale mal.