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.
18 filas convertidas, 8 correcciones, ninguna rechazada
Tablas en shop_2024_mariadb.sqlVolcado de MariaDB 11.8.9-MariaDB-ubu2404 · escrito por mariadb-dump · utf8mb4
customers8 filas3
8 columnas id INTEGER not null name VARCHAR(100) not null email VARCHAR(150) not null country VARCHAR(2) not null is_active INTEGER not null signed_up DATE created_at TIMESTAMP not null last_ip TEXT orders10 filas5
12 columnas id INTEGER not null customer_id INTEGER not null status TEXT not null total DECIMAL(10,2) not null items INTEGER 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 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
- "id" de customers no tiene signo, así que se volvió INTEGER con un CHECK de que no sea negativa.
- "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 SQLite acepte, así que la columna no tiene valor predeterminado.
- "customer_id" de orders no tiene signo, así que se volvió INTEGER con un CHECK de que no sea negativa.
- "id" de orders no tiene signo, así que se volvió INTEGER con un CHECK de que no sea negativa.
- "items" de orders no tiene signo, así que se volvió INTEGER con un CHECK de que no sea negativa.
- 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 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 MariaDB | En SQLite | Línea del informe |
|---|---|---|
| TINYINT(1), BOOL | INTEGER 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 integers | INTEGER 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 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, 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 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 no es una fecha real se deja fuera en lugar de reemplazarse por una inventada. | zero_date_default |
| TIME | TIME 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. | |
| YEAR | INTEGER 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. | |
| DATETIME | DATETIME como texto ISO 8601SQLite 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 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 |
| ENUM | TEXT 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 | TEXT tal como lo escribe MySQL ('a,b')SQLite no tiene arreglos; el texto es el que devuelve MySQL. | |
| JSON | TEXTLas 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 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 set | los 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_INCREMENT | INTEGER 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 one | INTEGER 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_TIMESTAMP | un 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 columns | GENERATED 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 lacks | una 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 columns | columnas normalesSQLite no tiene columnas invisibles. | invisible_column |
| CHECK constraints | traducido, en línea en CREATE TABLESQLite solo acepta CHECK en CREATE TABLE. | |
| CHECK constraints with functions SQLite lacks | no se creaUn CHECK que no se puede escribir para SQLite 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 SQLite lacks | sin 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 indexes | no se creaSQLite busca texto con tablas FTS5 aparte, que necesitan sus propias consultas. | fulltext_not_created |
| SPATIAL indexes | no se creaSQLite no tiene índices espaciales sobre una columna. | spatial_index_not_created |
| functional indexes SQLite can't write | no 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 keys | en 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 key | no se creaSQLite necesita una clave única en las columnas referenciadas; InnoDB no. | 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 í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, BLOB | BLOBLos bytes siguen siendo bytes. | |
| PARTITION BY | una 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 engines | una tabla normalSQLite tiene un solo motor de tablas. | engine_dropped |
| dumps of several databases | un 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 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 | WKB 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 collations | comparació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 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 | TEXTEl 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) | 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.sqlLas 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.