domingo, 27 de febrero de 2011

Tipos de datos en SQLite 3

Los tipos de datos refiriéndonos a bases de datos, vienen a ser algo así como la regla que predefine el dato que será introducido en una base de datos o lo que es lo mismo, que la parte contratante de la primera parte será la parte contratante de la primera parte.
Estas reglas se predefinen para gozar posteriormente de operaciones contra esos datos. Por ejemplo, si tenemos un campo de una base de datos que almacena enteros(integers), podríamos sumar o realizar operaciones matemáticas, comparaciones... contra ellos.

$ sqlite enteros.db
SQLite version 2.8.17
Enter ".help" for instructions
sqlite> CREATE TABLE enteros(numero INTEGER);
sqlite> INSERT INTO enteros(numero) VALUES(1);
sqlite> INSERT INTO enteros(numero) VALUES(2);
sqlite> INSERT INTO enteros(numero) VALUES(3);
sqlite> SELECT * FROM enteros;
1
2
3
sqlite> SELECT SUM(numero) FROM enteros;
6
sqlite> 

Otras de las razones por las que se hace "tipado" es para diferenciar un dato de otro, para que así por ejemplo una cadena(string) se diferencia de una fecha. También para optimizar la cantidad de memoria que ocupa cada dato...

SQLite sin embargo es bastante flexible en cuanto a tipado a diferencia de otros motores de bases de datos.

sqlite> INSERT INTO enteros(numero) VALUES('hola');
sqlite> SELECT * FROM enteros;
1
2
3
hola
sqlite> SELECT SUM(numero) FROM enteros;
6

Ésto puede ser un coñazo o una ventaja, no sé.

En SQLite3 han pasado de tantos rollos de crear mil y un tipo de datos para reducirlos a 5, por lo que se lee, han programado sqlite3 de tal manera, que no importa tanto el tipado predefinido para cada campo, sino el tipado que se detecta en cada dato introducido:



TEXT, NUMERIC, INTEGER, REAL y BLOB; cinco, como los dedos de una mano para proceder al placer extramarital. Parece que el campo BLOB, que se suele utilizar para "meter" archivos(png,tar.gz...) en una base de datos, aún no funciona, habrá que probarlo.
Esto acarrea algunos inconvenientes, por ejemplo, imaginemos que queremos que un campo de nuestra bd sólo contenga números con dos decimales y parece que SQLite no lo permite, la solución pasaría por controlar el número de decimales con algún lenguaje de programación antes de insertar:

sqlite> CREATE TABLE decimales(decimal NUMERIC(10,2));
sqlite> INSERT INTO decimales VALUES(10);
sqlite> SELECT * FROM decimales;
10
sqlite> INSERT INTO decimales VALUES(10,2);
SQL error: table decimales has 1 columns but 2 values were supplied
sqlite> INSERT INTO decimales VALUES(10.2);
sqlite> SELECT * FROM decimales;
10
10.2
sqlite> INSERT INTO decimales VALUES(10.21);
sqlite> SELECT * FROM decimales;
10
10.2
10.21
sqlite> INSERT INTO decimales VALUES(10.211);
sqlite> SELECT * FROM decimales;
10
10.2
10.21
10.211

Para finalizar el tostón con manteca, un pequeño ejemplo con fechas:

sqlite> CREATE TABLE fechas(fecha NUMERIC);
sqlite> INSERT INTO fechas VALUES(date('now'));
sqlite> SELECT * FROM fechas;
2011-02-28
sqlite> SELECT * FROM fechas WHERE fecha='2011-02-28';
2011-02-28
sqlite> SELECT * FROM fechas WHERE fecha>'2011-02-28';
sqlite> SELECT * FROM fechas WHERE fecha<'2011-02-28';
sqlite> SELECT * FROM fechas WHERE fecha<='2011-02-28';
2011-02-28

No hay comentarios:

Publicar un comentario