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.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.