Colaciones . Tienes dos opciones, no tres:
utf8_bin trata a todos estos como diferentes :demandé y demande y Demandé .
utf8_..._ci (típicamente utf8_general_ci o utf8_unicode_ci ) trata a todos estos como lo mismo :demandé y demande y Demandé .
Si solo desea distinguir entre mayúsculas y minúsculas (demandé =demande , pero ninguno coincide con Demandé ), no tienes suerte.
Si solo desea sensibilidad al acento (demandé =Demandé , pero ninguno coincide con demande ), no tienes suerte.
Declaración . La mejor manera de hacer lo que elijas:
CREATE TABLE (
name VARCHAR(...) CHARACTER SET utf8 COLLATE utf8_... NOT NULL,
...
PRIMARY KEY(name)
)
No cambie la intercalación sobre la marcha . Esto no usará el índice (es decir, será lento) si la intercalación es diferente en name :
WHERE name = ... COLLATE ...
BINARIO . Los tipos de datos BINARY , VARBINARY y BLOB son muy parecidos a CHAR , VARCHAR y TEXT con COLLATE ..._bin . Quizás la única diferencia es que el texto se verificará para almacenar utf8 válido en un VARCHAR ... COLLATE ..._bin , pero no se verificará cuando se almacene en VARBINARY... . Comparaciones (WHERE , ORDER BY , etc) será el mismo; es decir, simplemente compare los bits, no haga dobleces ni recortes de acentos, etc.