Diferencias entre MYSQL y SQLite

Aunque el lenguaje SQL está normalizado, existen diferencias entre los distintos sistemas gestores bases de datos, por lo que algunas consultas no dan los mismos resultados en cada una de ellas.

En las soluciones de los ejercicios incluidos en en estos apuntes se utiliza tanto MySQL como SQLite como sistemas gestores de bases de datos, por lo que se comentan aquí algunas de las diferencias entre ellas.

Nombre de las bases de datos

En MySQL el nombre de la base de datos no puede contener guiones (-) ni puntos (.), pero en SQLite sí.

En las soluciones de los ejercicios incluidos en estos apuntes se ha intentado corregir esta diferencia no utilizando guiones (-) ni puntos (.) en los nombres de las bases de datos para que sean compatibles con ambas bases de datos.

Longitud de los campos

Si se guarda un dato más largo de la longitud del campo definida al crear la tabla, MySQL trunca la cadena, pero SQLite no. Por ejemplo, si se crea una tabla con un campo nombre VARCHAR (5) y se guarda la cadena abcdefghij, en MySQL se guardará la cadena abcde, mientras que en SQLite se guardará la cadena abcdefghij.

En las soluciones de los ejercicios incluidos en estos apuntes se ha intentado corregir esta diferencia validando los datos recibidos, de manera que si un dato recibido es más largo que el tamaño definido en la base de datos se muestra un aviso al usuario y no se guarda el dato.

Para calcular la longitud de las cadenas, se debe utilizar la función mb_strlen($cadena, "UTF-8") que tiene en cuenta los caracteres que ocupan más de un byte en UTF-8 (por ejemplo, las vocales acentuadas).

Mayúsculas, minúsculas y acentos

Al comparar si dos cadenas son idénticas, (WHERE campo=dato) SQLite que distingue entre mayúsculas y minúsculas o entre vocales acentuadas o sin acentuar, es decir, que si se busca "pepe", devolvería únicamente "pepe", no "Pepe" o "pepé".

Al comparar si dos cadenas son similares, (WHERE campo LIKE dato) SQLite no distingue entre mayúsculas y minúsculas aunque que lo hace entre vocales acentuadas o sin acentuar, es decir, que si se busca "pepe", devolvería únicamente "pepe" o "Pepe", pero no "pepé".

Dependiendo del tipo de cotejamiento elegido al crear la base de datos o al realizar las consultas, MySQL distingue o no entre mayúsculas y minúsculas o entre vocales acentuadas o sin acentuar:

// EJEMPLOS DE CONSULTAS CON COLLATE 
$consultaCreaDb = "CREATE DATABASE $dbDb
    CHARACTER SET utf8mb4
    COLLATE utf8mb4_unicode_ci";  // NO distingue

$consultaCreaDb = "CREATE DATABASE $dbDb
    CHARACTER SET utf8mb4
    COLLATE utf8mb4_bin";         // SÍ distingue

$consulta = "SELECT * FROM $dbTabla
    WHERE nombre LIKE :nombre COLLATE utf8mb4_unicode_ci
    AND apellidos LIKE :apellidos COLLATE utf8mb4_unicode_ci
    ";                           // NO distingue

$consulta = "SELECT * FROM $dbTabla
    WHERE nombre LIKE :nombre COLLATE utf8mb4_bin
    AND apellidos LIKE :apellidos COLLATE utf8mb4_bin
    ";                           // SÍ distingue

En las soluciones de los ejercicios incluidos en estos apuntes no se ha intentado corregir esta diferencia, por lo que dependiendo de la base de datos utilizada, los programas funcionarán de distinta manera. Por ejemplo, si existe un registro "pepe", si la base de datos es MySQL no se podrá añadir un registro "Pepe", pero si es SQLite sí.

Por completar

Fecha vacía

Al insertar una fecha vacía, SQLite guarda una cadena vacía, mientras que MySQL guarda la cadena "0000-00-00".

En las soluciones de los ejercicios incluidos en estos apuntes se ha intentado corregir esta difernecia, guardando el valor "0000-00-00" cuando se quierre guardar una fecha no definida.


El siguiente ejemplo muestra la diferencia de comportamiento entre SQLite y MySQL (desgraciadamente, el servidor en el que se encuentran estos apuntes no permite trabajar con MySQL, aunque se puede descargar el código fuente del ejemplo en el apartado de soluciones de ejercicios y probarlo en su ordenador).

Enlace a ejemplo Comparación entre MySQL y SQLite - Fecha

ERROR (no puede mostrarse el objeto)