Потому что varchar - это строка, а не массив значений.
вам нужно сначала разбить значения поля types на массив значений, а потом уже искать среди них. Штатного аналога explode() вроде бы нет.
Посмотрите:
https://stackoverflow.com/a/5928675/5127037CREATE FUNCTION SPLIT_STRING(str VARCHAR(255), delim VARCHAR(12), pos INT)
RETURNS VARCHAR(255)
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(str, delim, pos),
LENGTH(SUBSTRING_INDEX(str, delim, pos-1)) + 1),
delim, '');
Ну дальше уже что-нибудь в духе
SELECT * FROM test WHERE 17 in ( SELECT SPLIT_STRING(test.types, ',' , 1) )