O Tipo SET
Um SET
é um objeto string que pode ter zero ou mais valores, cada um deve ser escolhido de uma lista de valores permitidos especificados quando a tabela é criada. Valores de colunas SET
que consistem de múltiplos membros são espeficados separados por virgula (',
'). Uma consquência distop é que valores dos membros de SET
não podem, eles mesmos, conter vírgula.
Por exemplo, uma coluna especificada como SET('um', 'dois') NOT NULL
pode ter qualquer um destes valores:
'' 'um' 'dois' 'um, dois'
Um SET
pode ter no máximo 64 membros diferentes.
A partir da versão 3.23.51, espaços extras são automaticamente removidos dos valores de SET
quando a tabela é criada.
MySQL armazena valores SET
numericamente, com o bit de baixa-ordem do valor armazenado correspondendo ao primeiro membro do conjunto. Se você recupera um valor SET
em um contexto numérico, o valor recuperado tem o conjunto de bits correspondente aos membros que aparecem no valor da coluna. Por exemplo, você pode recuperar valores numéricos de uma coluna SET
assim:
mysql> SELECT col_set+0 FROM nome_tabela;
Se um número é armazenado em uma coluna SET
, os bits que estão habilitados (com 1) na representação binária do número determinam o qual o membro no valor da coluna. Suponha uma coluna especificada como SET('a','b','c','d')
. Então os membros terão os seguintes valores binários:
SET membro
| Valor decimal | Valor binário |
a
| 1
| 0001
|
b
| 2
| 0010
|
c
| 4
| 0100
|
d
| 8
| 1000 |
Se você atribuir um valor 9
a esta coluna, que é 1001
em binário, o primeiro e o quarto valores membros do SET
'a'
e 'd'
são selecionados e o valor resultante é 'a,d'
.
Para um valor contendo mais que um elemento de SET
, não importa em qual ordem os elementos são listados quando foram inseridos seus valores. Também não importa quantas vezes um dado elemento e listado no valor. Quando o valor é recuperado posteriormente, cada elemento aparecerá uma vez, listados de acordo com a ordem em que eles foram especificados na crição da tabela. Por exemplo, se uma coluna é especificada como SET('a','b','c','d')
, então 'a,d'
, 'd,a'
e 'd,a,a,d,d'
irão todos aparecer como 'a,d'
quando recuperados.
Se você define um valor que não é suportado pela coluna SET
, o valor será ignorado.
Valores SET
são ordenados numéricamente. Valores NULL
vêm antes de valores SET
não NULL
.
Normalmente, você realiza um SELECT
em uma coluna SET
usando o operador LIKE
ou a função FIND_IN_SET()
:
mysql>SELECT * FROM nome_tabela WHERE col_set LIKE '%valor%';
mysql>SELECT * FROM nome_tabela WHERE FIND_IN_SET('valor',col_set)>0;
Mas o seguinte também funciona:
mysql>SELECT * FROM nome_tabela 2 WHERE col_set = 'val1,val2';
mysql>SELECT * FROM nome_tabela 3 WHERE col_set & 1;
A primeira desta instruções procura por uma correpondencia exata. A segunda por valores contendo o primeiro membro.
Se você quer obter todos os valores possíveis para uma coluna SET
, você deve usar: SHOW COLUMNS FROM nome_tabela LIKE nome_coluna_set
e analizar a definição do SET
na segunda coluna.