Saltar al contenido
Inicio de IntoSQL

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.

Tu archivo
sqlshop_2024_sqlserver.sqlArchivo de ejemplo, 11 kB
Tu base de datos

18 filas convertidas, 3 correcciones, ninguna rechazada

Mostrar

Tablas en shop_2024_sqlserver.sqlVolcado de SQL Server · escrito por SQL Server Management Objects · utf-8

  • orders10 filas1
    11 columnas
    idint not null
    customer_idint not null
    statusvarchar(10) not null
    totaldecimal(19,4) not null
    itemstinyint unsigned not null
    ordered_atdatetime not null
    shipped_atdatetime(6)
    notetext
    detailstext
    order_refchar(36) not null
    total_with_taxdecimal(12,2)
  • customers8 filas2
    8 columnas
    idint not null
    namevarchar(100) not null
    emailvarchar(200) not null
    countrychar(2) not null
    is_activetinyint(1) not null
    signed_update
    created_atdatetime not null
    row_versionblob

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

  1. "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.
  2. "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.
  3. "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 ServerEn MySQLLínea del informe
bittinyint(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), textchar(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, smallmoneydecimal(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, smalldatetimedatetime(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
datetimeoffsetdatetime(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
timetime(p)Las mismas horas del día.
dates before the year 1000NULLMySQL 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.
uniqueidentifierchar(36)Los mismos identificadores, escritos en minúsculas.
binary, varbinary, imagebinary(n), varbinary(n) y tipos blobLos bytes siguen siendo bytes.
geometry, geographyblob 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, timestampblob, 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, vectorlongtextMySQL 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
IDENTITYAUTO_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 keyun entero simpleMySQL cuenta una columna por tabla, al inicio de una clave; cualquier otra conserva sus valores sin contador.counter_dropped
CREATE SEQUENCEno se creaMySQL no tiene secuencias. Los valores que entregó una secuencia están en las filas.sequence_not_converted
computed columnscolumnas 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 lacksuna 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 FORsin valor predeterminadoUn valor predeterminado que no se puede escribir se deja fuera y aparece en el informe.default_not_translated
CHECK constraintstraducidosMySQL 5.7 los conserva sin comprobarlos; las demás versiones los comprueban al cargar cada fila.
CHECK constraints with functions MySQL lacksno se creaUn CHECK que no se puede escribir se deja fuera y aparece en el informe.check_skipped
CHECK constraints added WITH NOCHECK or disabledno se creaSQL Server no aplica estos CHECK, así que las filas pueden no cumplirlos.check_not_enforced
filtered and columnstore indexesno se creaIntoSQL escribe índices b-tree sobre columnas completas; vuelve a crear los demás después de cargar.index_skipped
foreign keysclaves 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 createno se creaUna clave no puede nombrar una tabla que no existe.foreign_key_skipped
tables on a partition schemeuna 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
schemasuna 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 NULLsin 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 functionslistados 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 valuesNULLUn convertidor que no ejecuta una base de datos no puede evaluarlas.expression_value
types IntoSQL doesn't knowlongtextEl texto admite cualquier valor; cambia el tipo después de cargar.unknown_type
NUL characters in textse conservaEl valor se copia con el carácter NUL escapado.
text that isn't valid in its encodinglos 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.sql

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