Un estándar con acentos
SQL es un estándar: sus instrucciones básicas están definidas por una norma y son las mismas en cualquier gestor. Pero cada gestor le agrega sus propias variantes, funciones y detalles de sintaxis. A ese conjunto de particularidades se le llama dialecto.
La comparación que mejor lo explica es la del idioma: el castellano es uno solo, y un argentino, un español y un mexicano se entienden entre sí. Pero cada uno tiene sus palabras propias, sus giros y su acento. Con SQL pasa lo mismo: lo esencial se entiende en todos lados, y las diferencias aparecen en los detalles.
En esta materia se trabaja con MariaDB, que es el gestor que viene en XAMPP y el que se va a encontrar en cualquier servidor donde se publique el sitio: es el foco de todo el material. Ahora bien, SQLite no es «otro gestor parecido»: es otra forma de entender qué es una base de datos —un archivo en lugar de un servidor—, y por eso conviene entender la diferencia aunque no se lo use acá. Esa comparación es la que hay que tener clara antes que la sintaxis, porque SQLite está en todas partes: en los teléfonos, en los navegadores y en la mitad de los programas de escritorio.
Qué es MySQL
MySQL es un servidor de bases de datos. Es decir: un programa que se instala, queda corriendo de fondo y atiende pedidos. Se lo llama servidor porque espera a que alguien le pida algo, y puede atender a muchos clientes al mismo tiempo, cada uno con su consulta.
Las consecuencias de ser un servidor:
- Los datos no son un archivo que se abre. Viven en un conjunto de archivos que administra el servidor, en su propio directorio, y nadie los abre a mano.
- Hay usuarios y contraseñas. El servidor sabe quién se conecta, y qué puede hacer cada uno. Un usuario puede tener permiso para leer una tabla y no para escribirla.
- Las conexiones son remotas. El cliente puede estar en otra máquina: se conecta por red, indicando la dirección del servidor.
- Muchos a la vez. Está construido para que cien personas consulten y carguen datos simultáneamente sin pisarse.
Ese conjunto de características es lo que lo hace el gestor natural para una aplicación web, donde el usuario está en su casa y la base está en un servidor de internet. MySQL y MariaDB son compatibles: MariaDB nació como una copia libre de MySQL y hoy los dos siguen el mismo dialecto. Para lo que se ve en esta materia son intercambiables, y las diferencias solo importan a niveles muy avanzados.
Qué es SQLite
SQLite es algo completamente distinto y conviene decirlo sin rodeos: no es un servidor. Es una biblioteca —un conjunto de funciones— que se mete dentro del programa que la usa y trabaja sobre un solo archivo.
Y ahí está la idea que lo explica todo: en SQLite, la base de datos es el archivo. Un archivo llamado, por ejemplo, biblioteca.db que se copia, se mueve, se comprime y se manda por correo como cualquier otro documento. Si se quiere hacer una copia de seguridad, se copia el archivo; si se quiere llevar el sistema a otra máquina, se copia el archivo.
Las consecuencias:
- No hay nada que instalar ni que mantener. SQLite viene incluido en PHP. No hay servidor que arrancar, puerto que abrir ni configuración que hacer.
- No hay usuarios ni contraseñas. No existen, y no es un olvido: si alguien puede abrir el archivo, puede hacer lo que quiera con él. La seguridad es la del sistema de archivos, no la del gestor.
- Una escritura a la vez. Varios lectores simultáneos sí, pero para escribir se turnan. Para un sitio con mucho movimiento no alcanza.
- Base chica, cero mantenimiento. Es ideal para lo que tiene que funcionar sin que nadie lo administre.
Cuesta creer que algo tan simple sea un gestor de bases de datos completo, y lo es: soporta transacciones, claves foráneas e índices. Se usa en los teléfonos —donde cada aplicación guarda sus datos en un archivo SQLite—, en los navegadores, en programas de escritorio de todo tipo y en millones de sitios chicos.
Diferencias
| MySQL / MariaDB | SQLite | |
|---|---|---|
| Qué es | Un servidor: un programa que atiende pedidos. | Una biblioteca que trabaja sobre un archivo. |
| Instalación | Hay que instalarlo, arrancarlo y mantenerlo. | Ninguna: viene con PHP. |
| Dónde viven los datos | En archivos que administra el servidor. | En un solo archivo. La base es el archivo. |
| Cómo se conecta | Host, usuario, contraseña y nombre de la base. | Solo la ruta del archivo. |
| Usuarios y permisos | Sí: por usuario, por base y por tabla. | No existen. Quien abre el archivo puede todo. |
| Varios usuarios a la vez | Sí, está hecho para eso. | Varios leen, pero escriben de a uno. |
| Tipos de datos | Muchos y estrictos. El largo del texto se declara y se exige. | Pocos y flexibles. El largo declarado se acepta pero no se exige. |
| Clave automática | INT AUTO_INCREMENT PRIMARY KEY |
INTEGER PRIMARY KEY |
| Tamaño | Gigabytes sin problema. | Base chica o mediana. |
| Copia de seguridad | Se exporta desde el gestor. | Se copia el archivo. |
| Uso típico | Sitios y sistemas en red, con muchos usuarios. | Aplicaciones de celular, programas de escritorio, prototipos, pruebas. |
Hay una diferencia que se lleva más de un dolor de cabeza y por eso merece el párrafo aparte: los tipos. En MySQL, si una columna se declara VARCHAR(50), un texto de 60 caracteres no entra y la base lo rechaza. En SQLite, esa misma declaración se acepta pero no se exige —el texto de 60 caracteres entra igual, y hasta se puede guardar un texto en una columna declarada numérica—. A eso se lo llama tipado flexible.
Para aprender tiene una ventaja y una trampa. La ventaja es que no hay que pelear con los tipos mientras se practica. La trampa es que un error de tipo que MySQL habría frenado en el acto pasa sin ruido y aparece mucho después, cuando se intenta sumar una columna y resulta que adentro hay textos. En SQLite, la disciplina de cuidar los tipos la tiene que poner el programa, porque la base no la va a poner por uno.
Similitudes
Son más de las que parece, y son las que importan para el trabajo real:
- El SQL del núcleo es el mismo.
CREATE TABLE,INSERT,SELECT,UPDATEyDELETEfuncionan igual en los dos. Todo lo que se aprendió en la Unidad 3 sirve tal cual. - Los dos tienen transacciones, claves foráneas e índices. Las tres herramientas del diseño serio están en ambos.
- Los dos son software libre y se pueden usar sin pagar licencia.
- Los dos se manejan desde PHP con PDO, que es la parte que se ve en la página de PHP de esta unidad.
Y esa última es la similitud que más se nota al programar, porque el código queda casi idéntico. La única línea que cambia es la de la conexión:
<?php
// Con MySQL: hay que decir dónde está el servidor y quién se conecta
$bd = new PDO('mysql:host=localhost;dbname=biblioteca;charset=utf8mb4', 'usuario', 'clave');
// Con SQLite: alcanza con la ruta del archivo
$bd = new PDO('sqlite:biblioteca.db');
Todo lo que viene después —preparar la consulta, ejecutarla, leer el resultado— es exactamente lo mismo. Esa es la razón por la que conviene aprender con los dos: el mismo programa funciona con un servidor en internet o con un archivo en un pendrive, cambiando una línea. Y es también por lo que los errores de portabilidad aparecen recién en las consultas complejas, cuando se empiezan a usar funciones que un dialecto tiene y el otro no.
Cuál usar
| La situación | Conviene | Por qué |
|---|---|---|
| Practicar y aprender SQL | SQLite | Cero configuración: se crea el archivo y ya está. |
| Un sitio publicado con usuarios de verdad | MySQL | Aguanta varios usuarios simultáneos y permite separar permisos. |
| Una aplicación de celular o de escritorio | SQLite | Va todo adentro del dispositivo, sin servidor que administrar. |
| Un sistema en red dentro de una institución | MySQL | Muchas terminales consultando a la vez sobre la misma base. |
| Un prototipo para mostrar y probar | SQLite | Se entrega en un solo archivo, sin pedir que instalen nada. |
En esta materia se trabaja con MariaDB, que es el gestor que trae XAMPP y el que se encuentra en cualquier servidor donde se publique el sitio. SQLite queda como lo que es: una alternativa para casos concretos, no el gestor de la cátedra. Conviene igual saber que el código PHP de la unidad sirve para los dos —cambia solo la línea de conexión— y que eso tiene una ventaja práctica el día que haya que entregar un trabajo: se copia la carpeta en un pendrive, con el archivo de la base adentro, y funciona en cualquier máquina que tenga PHP, sin instalar ni configurar nada.
Resumen
- SQL es un estándar, y cada gestor tiene su dialecto: variantes y funciones propias.
- MySQL y MariaDB son un servidor: se instala, corre de fondo, y atiende a muchos clientes a la vez. Es el que se usa en la materia.
- SQLite es una biblioteca que trabaja sobre un archivo: la base es el archivo.
- MariaDB tiene usuarios y permisos; SQLite no tiene ninguno.
- MariaDB aguanta muchos usuarios escribiendo a la vez; SQLite escribe de a uno.
- MariaDB es de tipos estrictos y SQLite de tipos flexibles: el largo declarado se acepta pero no se exige.
- MariaDB es la variante libre que trae XAMPP y es compatible con MySQL.
- En los dos, el SQL del núcleo es el mismo, y en PHP el código también: cambia solo la línea de conexión.
- SQLite para aprender, prototipos y aplicaciones locales; MariaDB para sitios y sistemas en red.