Un SET
es un objeto de cadenas de caracteres
que tiene cero o más valores, cada uno de ellos debe elegirse
de una lista de valores posibles especificada cuando se crea la
tabla. Los valores de columnas SET
que
consisten de múltiples miembros del conjunto se especifican con
los miembros separados por comas (',
'). Una
consecuencia de esto es que los miembros de
SET
no pueden contener comas ellos mismos.
Por ejemplo, una columna especificada como SET('one',
'two') NOT NULL
puede tener cualquiera de estos
valores:
'' 'one' 'two' 'one,two'
Un SET
puede tener un máximo de 64 miembros
distintos.
Los espacios finales se borran automáticamente de los miembros
de un SET
cuando se crea la tabla.
Cuando se recuperan, los valors almacenados en una columna
SET
se muestran usando la sensibilidad de
mayúsculas/minúsculas usando en la definición de la columna.
En MySQL 5.0, las columnas SET
pueden tener
un conjunto de caracteres y colación. Para colaciones binarias
o sensibles a mayúsculas/minúsculas, esta sensibilidad se
tiene en cuenta al asignar valores a la columna.
MySQL almacena valores SET
numéricamente,
con el bit de menos peso del valor almacenado correspondiente al
primer miembro del conjunto. Si recibe un valor
SET
en un contexto numérico, el valor
recibido tiene los bits asignados correspondientes a los
miembros que coinciden con el valor de la columna. Por ejemplo,
puede recuperar los valores numéricos de una columna
SET
así:
mysql> SELECTset_col
+0 FROMtbl_name
;
Si se almacena un número en una columna SET
,
los bits que se asignan en la representación binaria del
número determinan los miembros del conjunto en el valor de la
columna. Para una columna especificada como
SET('a','b','c','d')
, los miembros tienen los
siguientes valores decimales y binarios:
SET Miembro
|
Valor decimal | Valor binario |
'a' |
1 |
0001 |
'b' |
2 |
0010 |
'c' |
4 |
0100 |
'd' |
8 |
1000 |
Si asigna un valor de 9
a esta columna, esto
es 1001
en binario, de forma que el primer y
cuarto miembro delSET
'a'
y 'd'
se seleccionan y el valor resultante es
'a,d'
.
Para un valor que contenga más de un elemento
SET
, no importa el orden en que se listen los
elementos cuando inserte el valor. Tampoco no importa cuántas
veces se lista un elemento dado para el valor. Cuando el valor
se recupera posteriormente, cada elemento en el valor aparece
una vez, con los elementos listados según el orden en que se
especificaron al crear la tabla. Si una columna se especifica
como SET('a','b','c','d')
,
'a,d'
, 'd,a'
, y
'd,a,a,d,d'
aparecen como
'a,d'
al recuperarse.
Si asigna un valor no soportado a una columna
SET
, el valor se ignora.
Los valores SET
se ordenan numéricamente.
Los valores NULL
se ordenan antes de los no
NULL
.
Normalmente, busca valores SET
usando la
función FIND_IN_SET()
o el operador
LIKE
:
mysql> SELECT * FROMtbl_name
WHERE FIND_IN_SET('value
',set_col
)>0; mysql> SELECT * FROMtbl_name
WHEREset_col
LIKE '%value
%';
El primer comando encuentra registros cuando
set_col
contiene el miembro
value
del conjunto. El segundo es
similar, pero no igual: encuentra registros cuando
set_col
contengan el valor
value
en cualquier sitio, incluso
cuando es una subcadena de otro miembro del conjunto.
Los siguientes comandos también son legales:
mysql> SELECT * FROMtbl_name
WHEREset_col
& 1; mysql> SELECT * FROMtbl_name
WHEREset_col
= 'val1
,val2
';
El primero de estos comandos busca valores que contengan el
primer miembro del conjunto. El segundo busca una coincidencia
exacta. Tenga cuidado con las comparaciones del segundo tipo.
Comparar valores del conjunto
'
retorna distintos resultados que comparar valores de
val1
,val2
''
.
Debe especificar los valores en el mismo orden en que se listan
en la definición de la columna.
val2
,val1
'
Si desea determinar todos los valores posibles para una columna
SET
, use SHOW COLUMNS FROM
y parsee la
definición de tbl_name
LIKE
set_col
SET
en la segunda columna de
la salida.
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.