Saltar al contenido
Inicio de IntoSQL

Convierte MariaDB a SQLite

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

Tu archivo
sqlshop_2024_mariadb.sqlArchivo de ejemplo, 6,6 kB
Tu base de datos

18 filas convertidas, 8 correcciones, ninguna rechazada

Mostrar

Tablas en shop_2024_mariadb.sqlVolcado de MariaDB 11.8.9-MariaDB-ubu2404 · escrito por mariadb-dump · utf8mb4

  • customers8 filas3
    8 columnas
    idINTEGER not null
    nameVARCHAR(100) not null
    emailVARCHAR(150) not null
    countryVARCHAR(2) not null
    is_activeINTEGER not null
    signed_upDATE
    created_atTIMESTAMP not null
    last_ipTEXT
  • orders10 filas5
    12 columnas
    idINTEGER not null
    customer_idINTEGER not null
    statusTEXT not null
    totalDECIMAL(10,2) not null
    itemsINTEGER not null
    ordered_atDATETIME not null
    shipped_atDATETIME
    noteVARCHAR(255)
    order_refTEXT not null
    invoiceINTEGER not null
    detailsTEXT
    updated_atTIMESTAMP not null
-- Written by IntoSQL from a MySQL dump. Load it with: sqlite3 -bail <database> < <file>
PRAGMA foreign_keys = OFF;
PRAGMA synchronous = OFF;
BEGIN;

CREATE TABLE customers ( -- People who bought at least once
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(150) NOT NULL,
    country VARCHAR(2) DEFAULT 'US' NOT NULL,
    is_active INTEGER DEFAULT 1 NOT NULL,
    signed_up DATE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
    last_ip TEXT,
    CONSTRAINT customers_id_check CHECK (id >= 0)
);

CREATE TABLE orders (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    customer_id INTEGER NOT NULL,
    status TEXT DEFAULT 'pending' NOT NULL,
    total DECIMAL(10,2) NOT NULL,
    items INTEGER DEFAULT 1 NOT NULL,
    ordered_at DATETIME NOT NULL,
    shipped_at DATETIME,
    note VARCHAR(255),
    order_ref TEXT NOT NULL,
    invoice INTEGER NOT NULL,
    details TEXT,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
    CONSTRAINT orders_id_check CHECK (id >= 0),
    CONSTRAINT orders_customer_id_check CHECK (customer_id >= 0),
    CONSTRAINT orders_status_check CHECK (status IN ('pending', 'paid', 'shipped', 'cancelled', '')),
    CONSTRAINT orders_items_check CHECK (items >= 0),
    CONSTRAINT fk_orders_customer FOREIGN KEY (customer_id) REFERENCES customers (id)
);

INSERT INTO customers (id, name, email, country, is_active, signed_up, created_at, last_ip) VALUES
(1,'Ana Martínez','ana@example.com','MX',1,'2023-01-15','2023-01-15 10:24:00','::ffff:203.0.113.7'),
(2,'Zoë Müller','zoe@example.de','DE',1,'2023-02-03','2023-02-03 08:11:42','2001:db8::1'),
(3,'José Peña','jose@example.es','ES',0,'2023-03-21','2023-03-21 19:05:17',NULL),
(4,'李雷','lilei@example.cn','CN',1,'2023-05-09','2023-05-09 02:40:00','::ffff:198.51.100.23'),
(5,'Noah O''Brien','noah@example.ie','IE',1,NULL,'2023-06-30 14:00:00',NULL),
(6,'Amélie Laurent','amelie@example.fr','FR',1,'2024-01-02','2024-01-02 09:30:00','2001:db8:85a3::8a2e:370:7334'),
(7,'Ravi Patel','ravi@example.in','IN',0,'2024-02-29','2024-02-29 23:59:59','::ffff:192.0.2.200'),
(8,'Sofia Rossi 🌻','sofia@example.it','IT',1,'2024-04-12','2024-04-12 12:12:12',NULL);
INSERT INTO orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, order_ref, invoice, details, updated_at) VALUES
(1,1,'shipped',129.90,3,'2024-03-01 10:00:00','2024-03-02 16:30:00',NULL,'0b7a4c2e-3f1d-4e8a-9c55-1a2b3c4d5e6f',1000,'{"gift": false}','2024-03-02 16:30:00'),
(2,2,'paid',54.00,1,'2024-03-02 11:15:00',NULL,'Gift wrap 🎁','1c8b5d3f-4a2e-4f9b-8d66-2b3c4d5e6f70',1001,'{"gift": true, "wrap": "red"}','2024-03-02 11:20:00'),
(3,1,'cancelled',12.50,1,'2024-03-03 09:45:00',NULL,'Customer changed their mind','2d9c6e4a-5b3f-4a0c-9e77-3c4d5e6f7081',1002,NULL,'2024-03-03 10:00:00'),
(4,4,'shipped',980.00,12,'2024-03-05 02:10:00','2024-03-07 08:00:00','请小心轻放','3e0d7f5b-6c4a-4b1d-8f88-4d5e6f708192',1003,'{"fragile": true}','2024-03-07 08:00:00'),
(5,5,'pending',45.75,2,'2024-03-08 17:20:00',NULL,'Leave at the door; ring twice','4f1e806c-7d5b-4c2e-9a99-5e6f708192a3',1004,NULL,'2024-03-08 17:20:00'),
(6,6,'shipped',310.40,5,'2024-03-10 13:00:00','2024-03-11 09:00:00','Fragile: "glass"','50f2917d-8e6c-4d3f-8baa-6f708192a3b4',1005,'{"fragile": true}','2024-03-11 09:00:00'),
(7,8,'paid',76.20,2,'2024-03-11 18:45:00',NULL,NULL,'6103a28e-9f7d-4e40-9cbb-708192a3b4c5',1006,NULL,'2024-03-11 18:46:00'),
(8,2,'',19.99,1,'2024-03-12 08:00:00',NULL,'Status lost in an old import','7214b39f-a08e-4f51-8dcc-8192a3b4c5d6',1007,NULL,'2024-03-12 08:00:00'),
(9,3,'shipped',64.00,2,'2024-03-14 15:30:00',NULL,'Shipping date never recorded','8325c4a0-b19f-4062-9edd-92a3b4c5d6e7',1008,'{"parcels": [1, 2]}','2024-03-15 10:00:00'),
(10,7,'paid',1499.00,1,'2024-03-15 21:05:00',NULL,'C:\Users\ravi\invoice.pdf','9436d5b1-c2a0-4173-8fee-a3b4c5d6e7f8',1009,NULL,'2024-03-15 21:05:00');

-- Indexes, triggers and counters, after the rows so each index builds once.
CREATE UNIQUE INDEX customers_uq_email ON customers (email);
CREATE INDEX orders_idx_customer ON orders (customer_id);
CREATE INDEX orders_idx_status_date ON orders (status, ordered_at);
UPDATE sqlite_sequence SET seq = max(seq, 1000) WHERE name = 'customers';
INSERT INTO sqlite_sequence (name, seq) SELECT 'customers', 1000 WHERE NOT EXISTS (SELECT 1 FROM sqlite_sequence WHERE name = 'customers');
UPDATE sqlite_sequence SET seq = max(seq, 5000) WHERE name = 'orders';
INSERT INTO sqlite_sequence (name, seq) SELECT 'orders', 5000 WHERE NOT EXISTS (SELECT 1 FROM sqlite_sequence WHERE name = 'orders');
CREATE TRIGGER orders_updated_at_on_update AFTER UPDATE ON orders FOR EACH ROW WHEN NEW.updated_at IS OLD.updated_at AND (NEW.id IS NOT OLD.id OR NEW.customer_id IS NOT OLD.customer_id OR NEW.status IS NOT OLD.status OR NEW.total IS NOT OLD.total OR NEW.items IS NOT OLD.items OR NEW.ordered_at IS NOT OLD.ordered_at OR NEW.shipped_at IS NOT OLD.shipped_at OR NEW.note IS NOT OLD.note OR NEW.order_ref IS NOT OLD.order_ref OR NEW.invoice IS NOT OLD.invoice OR NEW.details IS NOT OLD.details)
BEGIN
    UPDATE orders SET updated_at = CURRENT_TIMESTAMP WHERE rowid = NEW.rowid;
END;
COMMIT;

-- Rows whose foreign key finds no parent, if any: the load doesn't stop for them.
PRAGMA foreign_key_check;

Correcciones

  1. "id" de customers no tiene signo, así que se volvió INTEGER con un CHECK de que no sea negativa.
  2. "signed_up" de customers ahora admite NULL: algunos de sus valores no se pudieron guardar y quedan en NULL.
  3. El valor predeterminado de "signed_up" en customers, 0000‑00‑00, no es una fecha que SQLite acepte, así que la columna no tiene valor predeterminado.
  4. "customer_id" de orders no tiene signo, así que se volvió INTEGER con un CHECK de que no sea negativa.
  5. "id" de orders no tiene signo, así que se volvió INTEGER con un CHECK de que no sea negativa.
  6. "items" de orders no tiene signo, así que se volvió INTEGER con un CHECK de que no sea negativa.
  7. 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.
  8. "updated_at" de orders cambia a la hora actual en cada actualización; en SQLite lo hace un disparador.

Para revisar

  • 1 secuencia no se crea; SQLite no tiene secuencias. Guarda el siguiente valor en una tabla si tu aplicación lo necesita.
  • 1 valor en "signed_up" de customers es una fecha cero o imposible, como 0000‑00‑00, que SQLite no puede guardar, así que queda en NULL. Si esas fechas significan algo, reemplázalas en el origen por fechas reales antes del volcado.
  • El valor predeterminado de "invoice" en orders no se puede escribir para SQLite (a sequence), así que la columna no tiene valor predeterminado. Agrega el valor predeterminado a mano si las filas nuevas lo necesitan.
  • 1 valor en "shipped_at" de orders es una fecha cero o imposible, como 0000‑00‑00 00:00:00, que SQLite 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 MariaDB a SQLite

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

    INTEGER con los valores tal cual

    SQLite no tiene tipo booleano; true y false son los enteros 1 y 0, así que cada valor conserva su significado.

  • UNSIGNED integers

    INTEGER con un CHECK de que no sea negativo; BIGINT UNSIGNED con valores mayores que 2^63-1 es TEXT

    Los enteros de SQLite son de 64 bits y con signo. El CHECK deja fuera los valores negativos como hacía MySQL; los valores fuera del rango con signo se guardan como texto para no perder ningún dígito.

    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, sin la escala

    Los números de punto flotante de SQLite 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 15 dígitos; TEXT si son más

    SQLite guarda unos 15 dígitos significativos en un número. 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)

    INTEGER con el valor de los bits; BIT(64) como dígitos en TEXT

    Un campo de bits se guarda como el número que forman sus bits. El bit más alto de un BIT(64) no cabe en un entero con signo, así que su número se guarda como texto.

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

    NULL

    Las funciones de fecha de SQLite solo leen fechas reales del calendario. Se vuelven NULL y el informe las cuenta, como con las demás bases de datos.

    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 no es una fecha real se deja fuera en lugar de reemplazarse por una inventada.

    Línea del informe: zero_date_default

  • TIME

    TIME como texto, tal como lo escribe MySQL, con duraciones incluidas

    SQLite guarda las horas como texto, así que las duraciones de más de un día o negativas se conservan con exactitud.

  • YEAR

    INTEGER con un CHECK de su rango

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

  • CHAR(n), VARCHAR(n)

    VARCHAR(n), sin aplicar el límite

    SQLite guarda el tipo declarado para que las herramientas lo lean, pero no limita la longitud; los valores son los que devuelve MySQL.

  • DATETIME

    DATETIME como texto ISO 8601

    SQLite guarda las fechas como texto que leen sus funciones de fecha.

  • TIMESTAMP

    TIMESTAMP como texto ISO 8601 en UTC; la zona que indica el volcado, UTC si no indica ninguna

    Un TIMESTAMP es un instante, escrito en UTC. 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

    TEXT 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

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

    SQLite no tiene arreglos; el texto es el que devuelve MySQL.

  • JSON

    TEXT

    Las funciones JSON de SQLite leen JSON desde texto. Una columna declarada JSON convertiría "123" en un número, así que es TEXT.

  • NUL bytes in text

    se conserva

    El texto de SQLite puede contener un byte 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 de SQLite es UTF-8; sus funciones leen mal los bytes que no lo son.

    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

    INTEGER PRIMARY KEY AUTOINCREMENT, con el contador después de los ids copiados

    SQLite cuenta una clave primaria entera completa. AUTOINCREMENT evita que se reutilicen los ids, como hace MySQL, y el contador sigue después del id más alto o del AUTO_INCREMENT del volcado, el que sea mayor.

  • AUTO_INCREMENT on part of a key or outside one

    INTEGER sin contador

    SQLite solo cuenta una columna que es toda la clave primaria, así que la columna conserva sus valores y las filas nuevas necesitan los suyos.

    Línea del informe: identity_without_counter

  • ON UPDATE CURRENT_TIMESTAMP

    un disparador AFTER UPDATE

    El disparador pone la hora actual en la columna cuando una fila cambia y la actualización no la asignó, como hace MySQL.

    Línea del informe: on_update_trigger

  • generated columns

    GENERATED ALWAYS AS, VIRTUAL o STORED como en el origen

    SQLite 3.31 y posteriores calculan las columnas generadas de las mismas dos formas.

  • generated columns with functions SQLite lacks

    una columna simple

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

    Línea del informe: generated_not_translated

  • INVISIBLE columns

    columnas normales

    SQLite no tiene columnas invisibles.

    Línea del informe: invisible_column

  • CHECK constraints

    traducido, en línea en CREATE TABLE

    SQLite solo acepta CHECK en CREATE TABLE.

  • CHECK constraints with functions SQLite lacks

    no se crea

    Un CHECK que no se puede escribir para SQLite 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 SQLite lacks

    sin valor predeterminado

    Un valor predeterminado que no se puede escribir para SQLite 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 substr(c, 1, 20)

    SQLite indexa expresiones, así que se indexa el mismo prefijo y un prefijo único sigue siendo único.

    Línea del informe: prefix_unique

  • FULLTEXT indexes

    no se crea

    SQLite busca texto con tablas FTS5 aparte, que necesitan sus propias consultas.

    Línea del informe: fulltext_not_created

  • SPATIAL indexes

    no se crea

    SQLite no tiene índices espaciales sobre una columna.

    Línea del informe: spatial_index_not_created

  • functional indexes SQLite can't write

    no se crea

    Un índice sobre una expresión que no se puede escribir para SQLite se deja fuera y aparece en el informe.

    Línea del informe: index_skipped

  • foreign keys

    en CREATE TABLE, cargadas sin comprobar, luego listadas con PRAGMA foreign_key_check

    SQLite acepta claves foráneas solo en CREATE TABLE y las comprueba solo con PRAGMA foreign_keys activado. Las filas se cargan sin comprobar, como desde MySQL, y el script termina listando cada fila sin padre.

  • foreign keys to columns without a unique key

    no se crea

    SQLite necesita una clave única en las columnas referenciadas; InnoDB no.

    Línea del informe: foreign_key_skipped

  • table, index and column names

    tal como están escritos; renombrados cuando solo difieren en mayúsculas o se repite un nombre de índice

    Los nombres de SQLite no distinguen mayúsculas, y los nombres de índice comparten un espacio de nombres por base de datos.

    Línea del informe: identifier_renamed

  • GEOMETRY, POINT, POLYGON...

    WKB en un BLOB

    El formato binario estándar (well-known binary) conserva cada geometría con exactitud.

    Línea del informe: geometry_as_blob

  • INET4, INET6, UUID (MariaDB)

    TEXT

    SQLite no tiene esos tipos; el texto es el que devuelve MariaDB.

  • BINARY, VARBINARY, BLOB

    BLOB

    Los bytes siguen siendo bytes.

  • PARTITION BY

    una sola tabla

    Las filas son las mismas.

    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

    SQLite tiene un solo motor de tablas.

    Línea del informe: engine_dropped

  • dumps of several databases

    un archivo, cada tabla con el nombre de su base de datos delante

    Un archivo de SQLite es una base de datos, así que el nombre de la base de datos separa las tablas con el mismo nombre.

    Línea del informe: databases_merged

  • 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

    WKB en un BLOB

    El formato de geometría de MySQL se reconoce por los valores y se guarda como WKB estándar.

    Línea del informe: geometry_as_blob

  • _ci collations

    comparación exacta

    SQLite compara el texto exactamente, salvo que se le indique otra cosa, y su NOCASE solo iguala letras ASCII.

    Línea del informe: case_insensitive_collation

  • 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

    TEXT

    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)

    no se crea

    SQLite no tiene secuencias.

    Línea del informe: sequence_not_converted

  • VECTOR(n) (MariaDB 11.7+)

    TEXT con los números de punto flotante como arreglo JSON

    SQLite no tiene un tipo vector; un arreglo JSON conserva cada número.

    Línea del informe: type_replaced

En MariaDBEn SQLiteLínea del informe
TINYINT(1), BOOLINTEGER con los valores tal cualSQLite no tiene tipo booleano; true y false son los enteros 1 y 0, así que cada valor conserva su significado.
UNSIGNED integersINTEGER con un CHECK de que no sea negativo; BIGINT UNSIGNED con valores mayores que 2^63-1 es TEXTLos enteros de SQLite son de 64 bits y con signo. El CHECK deja fuera los valores negativos como hacía MySQL; los valores fuera del rango con signo se guardan como texto para no perder ningún dígito.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, sin la escalaLos números de punto flotante de SQLite no tienen escala fija. Los valores guardados se copian tal cual.float_scale_dropped
DECIMAL(p,s)DECIMAL(p,s) hasta 15 dígitos; TEXT si son másSQLite guarda unos 15 dígitos significativos en un número. Los decimales más anchos se guardan como texto para que cada dígito siga exacto.decimal_as_text
BIT(1), BIT(n)INTEGER con el valor de los bits; BIT(64) como dígitos en TEXTUn campo de bits se guarda como el número que forman sus bits. El bit más alto de un BIT(64) no cabe en un entero con signo, así que su número se guarda como texto.
zero, partial or impossible dates (0000-00-00, 2024-02-30)NULLLas funciones de fecha de SQLite solo leen fechas reales del calendario. Se vuelven NULL y el informe las cuenta, como con las demás bases de datos.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 no es una fecha real se deja fuera en lugar de reemplazarse por una inventada.zero_date_default
TIMETIME como texto, tal como lo escribe MySQL, con duraciones incluidasSQLite guarda las horas como texto, así que las duraciones de más de un día o negativas se conservan con exactitud.
YEARINTEGER con un CHECK de su rangoSQLite no tiene un tipo para años; el CHECK conserva los mismos valores que MySQL permite.
CHAR(n), VARCHAR(n)VARCHAR(n), sin aplicar el límiteSQLite guarda el tipo declarado para que las herramientas lo lean, pero no limita la longitud; los valores son los que devuelve MySQL.
DATETIMEDATETIME como texto ISO 8601SQLite guarda las fechas como texto que leen sus funciones de fecha.
TIMESTAMPTIMESTAMP como texto ISO 8601 en UTC; la zona que indica el volcado, UTC si no indica ningunaUn TIMESTAMP es un instante, escrito en UTC. 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
ENUMTEXT 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
SETTEXT tal como lo escribe MySQL ('a,b')SQLite no tiene arreglos; el texto es el que devuelve MySQL.
JSONTEXTLas funciones JSON de SQLite leen JSON desde texto. Una columna declarada JSON convertiría "123" en un número, así que es TEXT.
NUL bytes in textse conservaEl texto de SQLite puede contener un byte 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 de SQLite es UTF-8; sus funciones leen mal los bytes que no lo son.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_INCREMENTINTEGER PRIMARY KEY AUTOINCREMENT, con el contador después de los ids copiadosSQLite cuenta una clave primaria entera completa. AUTOINCREMENT evita que se reutilicen los ids, como hace MySQL, y el contador sigue después del id más alto o del AUTO_INCREMENT del volcado, el que sea mayor.
AUTO_INCREMENT on part of a key or outside oneINTEGER sin contadorSQLite solo cuenta una columna que es toda la clave primaria, así que la columna conserva sus valores y las filas nuevas necesitan los suyos.identity_without_counter
ON UPDATE CURRENT_TIMESTAMPun disparador AFTER UPDATEEl disparador pone la hora actual en la columna cuando una fila cambia y la actualización no la asignó, como hace MySQL.on_update_trigger
generated columnsGENERATED ALWAYS AS, VIRTUAL o STORED como en el origenSQLite 3.31 y posteriores calculan las columnas generadas de las mismas dos formas.
generated columns with functions SQLite lacksuna columna simpleUna fórmula que no se puede escribir para SQLite deja una columna simple y una línea en el informe.generated_not_translated
INVISIBLE columnscolumnas normalesSQLite no tiene columnas invisibles.invisible_column
CHECK constraintstraducido, en línea en CREATE TABLESQLite solo acepta CHECK en CREATE TABLE.
CHECK constraints with functions SQLite lacksno se creaUn CHECK que no se puede escribir para SQLite 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 SQLite lackssin valor predeterminadoUn valor predeterminado que no se puede escribir para SQLite se deja fuera y aparece en el informe.default_not_translated
keys and indexes on a prefix, c(20)un índice sobre substr(c, 1, 20)SQLite indexa expresiones, así que se indexa el mismo prefijo y un prefijo único sigue siendo único.prefix_unique
FULLTEXT indexesno se creaSQLite busca texto con tablas FTS5 aparte, que necesitan sus propias consultas.fulltext_not_created
SPATIAL indexesno se creaSQLite no tiene índices espaciales sobre una columna.spatial_index_not_created
functional indexes SQLite can't writeno se creaUn índice sobre una expresión que no se puede escribir para SQLite se deja fuera y aparece en el informe.index_skipped
foreign keysen CREATE TABLE, cargadas sin comprobar, luego listadas con PRAGMA foreign_key_checkSQLite acepta claves foráneas solo en CREATE TABLE y las comprueba solo con PRAGMA foreign_keys activado. Las filas se cargan sin comprobar, como desde MySQL, y el script termina listando cada fila sin padre.
foreign keys to columns without a unique keyno se creaSQLite necesita una clave única en las columnas referenciadas; InnoDB no.foreign_key_skipped
table, index and column namestal como están escritos; renombrados cuando solo difieren en mayúsculas o se repite un nombre de índiceLos nombres de SQLite no distinguen mayúsculas, y los nombres de índice comparten un espacio de nombres por base de datos.identifier_renamed
GEOMETRY, POINT, POLYGON...WKB en un BLOBEl formato binario estándar (well-known binary) conserva cada geometría con exactitud.geometry_as_blob
INET4, INET6, UUID (MariaDB)TEXTSQLite no tiene esos tipos; el texto es el que devuelve MariaDB.
BINARY, VARBINARY, BLOBBLOBLos bytes siguen siendo bytes.
PARTITION BYuna sola tablaLas filas son las mismas.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 normalSQLite tiene un solo motor de tablas.engine_dropped
dumps of several databasesun archivo, cada tabla con el nombre de su base de datos delanteUn archivo de SQLite es una base de datos, así que el nombre de la base de datos separa las tablas con el mismo nombre.databases_merged
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 TABLEWKB en un BLOBEl formato de geometría de MySQL se reconoce por los valores y se guarda como WKB estándar.geometry_as_blob
_ci collationscomparación exactaSQLite compara el texto exactamente, salvo que se le indique otra cosa, y su NOCASE solo iguala letras ASCII.case_insensitive_collation
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 knowTEXTEl 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)no se creaSQLite no tiene secuencias.sequence_not_converted
VECTOR(n) (MariaDB 11.7+)TEXT con los números de punto flotante como arreglo JSONSQLite no tiene un tipo vector; un arreglo JSON conserva cada número.type_replaced

Carga el script en SQLite

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.

sqlite3 -bail mydb.sqlite < mariadb.sqlite.sql

Las claves foráneas se declaran en cada tabla y las filas se cargan con la comprobación de claves foráneas desactivada. Luego el script lista cada fila que apunta a una fila que no existe, en lugar de fallar a medias.

Para un volcado grande, carga en un archivo nuevo en un disco local. El script carga todo en una sola transacción con la sincronización desactivada, así que va a la velocidad del disco, y una carga que se detiene a medias no deja tablas incompletas.

La línea de comandos carga el archivo directo en una base de datos SQLite, sin escribir un script. Es gratis.

Haz el volcado de MariaDB 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 utf8mb3 pierde antes de que el convertidor lo vea.
  • --hex-blob escribe las columnas binarias y los valores VECTOR 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 MariaDB. Aparecen en el informe por nombre, nunca se descartan en silencio, para que puedas reescribirlos para SQLite.

Preguntas sobre MariaDB a SQLite

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

¿De qué versiones de MariaDB puede venir el volcado?

Volcados de mariadb-dump y mysqldump en MariaDB 10.3 a 12, con un INSERT por tabla o uno por fila. Cada volcado de prueba viene de MariaDB 10.11, 11.4 y 11.8 y se compara con su origen celda por celda.

¿Se conservan las columnas UUID, INET6, JSON y VECTOR?

Las columnas UUID e INET se vuelven text, JSON text y VECTOR un arreglo JSON de sus números. Las fechas cero se vuelven NULL y el informe las cuenta.

¿Se conservan los valores AUTO_INCREMENT y las secuencias?

Una columna AUTO_INCREMENT que es toda la clave primaria de la tabla se vuelve INTEGER PRIMARY KEY AUTOINCREMENT y sigue después del id más alto. SQLite no tiene secuencias, así que el informe las indica.

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

¿En qué versiones de SQLite carga el script?

SQLite 3.31 y posteriores. Cada volcado de prueba carga en 3.31 y 3.54, y se detiene en el primer error si algo sale mal.