MySQL SET

Estuve revisando la vez pasada el tipo de dato SET de MySQL. El requerimiento presentado consistía en convertir 4 campos SET en un sólo (para simplificar la estructura de la tabla).

El campo SET es de tipo binario y su representación depende de la definición de la estructura de la tabla.


CREATE TABLE miTabla(
    id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    trimestre1 SET('Enero','Febrero','Marzo'),
    trimestre2 SET('Abril','Mayo','Junio'),
    trimestre3 SET('Julio','Agosto','Setiembre'),
trimestre4 SET('Octubre','Noviembre','Diciembre')
);
Insertamos unos datos de prueba. insert into miTabla (trimestre1,trimestre2,trimestre3,trimestre4)
values ('Enero','Abril,Junio','Setiembre','Octubre,Noviembre');
mysql> select * from miTabla; +----+------------+-------------+------------+-------------------+ | id | trimestre1 | trimestre2 | trimestre3 | trimestre4 | +----+------------+-------------+------------+-------------------+ | 1 | Enero | Abril,Junio | Setiembre | Octubre,Noviembre | +----+------------+-------------+------------+-------------------+ 1 row in set (0.00 sec)
Podemos observar que los datos se muestran como cadenas de caracteres separados por comas (tal y como se ingresó). Cabe anotar que no hubiera permitido ingresar otro valor que no estuviera definido en la estructura. En este caso, nos sirve como una restricción o validación de los datos a ingresar desde cualquier fuente.
Si queremos ver los datos en su representación binaria, basta con sumar un 0 a cada campo.
mysql> select id,trimestre1+0,0+trimestre2,trimestre3+0,trimestre4+0 from miTabl
a;
+----+--------------+--------------+--------------+--------------+
| id | trimestre1+0 | 0+trimestre2 | trimestre3+0 | trimestre4+0 |
+----+--------------+--------------+--------------+--------------+
|  1 |            1 |            5 |            4 |            3 |
+----+--------------+--------------+--------------+--------------+
1 row in set (0.00 sec)
Sea que el 0 se suma antes o despues del campo, el resultado nos permite observar el valor decimal de su contenido o representación binaria.
Ahora deseamos convertir estas cuatro columnas en una sola. No se pueden sumar los valores porque nos daría una representación errónea, para ello debemos usar operadores de bits.
Primero creamos la columna.
alter table miTabla add column meses SET('Enero','Febrero','Marzo','Abril ','Mayo','Junio','Julio','Agosto','Setiembre','Octubre','Noviembre','Diciembre');
Luego unificamos los datos.
UPDATE miTabla SET meses = MAKE_SET(trimestre1 | trimestre2 << 3 | trimestre3 << 6 | trimestre4 <<  9, 'Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Setiembre', 'Octubre', 'Noviembre', 'Diciembre');
mysql> select * from miTabla;
+----+------------+-------------+------------+-------------------+--------------
---------------------------------+
| id | trimestre1 | trimestre2  | trimestre3 | trimestre4        | meses
                                 |
+----+------------+-------------+------------+-------------------+--------------
---------------------------------+
|  1 | Enero      | Abril,Junio | Setiembre  | Octubre,Noviembre | Enero,Abril,J
unio,Setiembre,Octubre,Noviembre |
+----+------------+-------------+------------+-------------------+--------------
---------------------------------+
1 row in set (0.00 sec)
Como se puede observar, los datos fueron transferidos correctamente ayudados por los operadores y funciones de datos binarios de MySQL.
Se uso el operador OR (símbolo pipe | ) y el operador >> para desplazamiento binario a la izquierda. El número al costado del operador >>; le dice cuantos bits desplazar hacia esa dirección.
Espero que esta explicación permita ver el uso de los datos de tipo SET de una manera distinta.

Comentarios

Entradas populares