Du vill inte lagra värdet i den kommaseparerade formen.
Tänk på fallet när du bestämmer dig för att slå samman den här kolumnen med någon annan tabell.
Tänk att du har,
x items
1 1, 2, 3
1 1, 4
2 1
och du vill hitta distinkta värden för varje x, dvs.:
x items
1 1, 2, 3, 4
2 1
eller kanske vill kontrollera om den har 3 i sig
eller kanske vill konvertera dem till separata rader:
x items
1 1
1 2
1 3
1 1
1 4
2 1
Det kommer att vara EN STOR SMÄRTA.
Använd åtminstone normalisering 1:a principen - ha separata rader för varje värde.
Säg nu att du ursprungligen hade detta när du bordade:
x item
1 1
1 2
1 3
1 1
1 4
2 1
Du kan enkelt konvertera det till csv-värden:
select x, group_concat(item order by item) items
from t
group by x
Om du vill söka om x =1 har punkt 3. Lätt.
select * from t where x = 1 and item = 3
som i tidigare fall skulle använda hemskt find_in_set
:
select * from t where x = 1 and find_in_set(3, items);
Om du tror att du kan använda like med CSV-värden för att söka, like %x%
först kan inte använda index. För det andra kommer det att ge felaktiga resultat.
Säg att du vill kontrollera om objekt ab finns och att du gör %ab%
det kommer att returnera rader med abc abcd abcde .... .
Om du har många användare och objekt, skulle jag föreslå att du skapar en separat tabell users
med ett PK-användar-id, ett annat items
med PK itemid och slutligen en mappningstabell user_item
har användar-id, itemid-kolumner.
Om du vet att du bara behöver lagra och hämta dessa värden och inte göra någon operation på dem, såsom join, search, distinct, konvertering till separata rader etc. etc. - det kan vara helt enkelt, du kan (jag skulle fortfarande 't).