Como exemplo, pegue uma tabela de cidade com 2 colunas
- cidade_ref (bigint)
- city_name (varchar)
com índices em ambos.
Eu quero fazer uma pesquisa independente de caso por city_name.
Eu sei que posso usar como , mas isso não é muito eficiente.
Uma maneira seria armazenar a variação de letras maiúsculas do city_name em outro campo .
Mas não posso deixar de pensar que deveria haver uma maneira de usar charset ou collation para fazer isso.
Alguém pode me apontar na direção certa, por favor.
Não há problema em usar
LIKE
, desde que esteja em um formato como:SELECT * FROM My_Table WHERE City_Name LIKE 'Abc%';
Isso pode usar um índice. No entanto, o seguinte não pode.
SELECT * FROM My_Table WHERE City_Name LIKE UPPER('Abc%');
O uso de uma função (
UPPER()
) nega o índice - em termos técnicos, a consulta não ésargable
. Observe que a consulta também não pode ser sargável em casos como:SELECT * FROM My_Table WHERE City_Name LIKE '%Abc..';
O curinga no início da string de pesquisa torna qualquer índice não funcional.
Um gatilho ON INSERT e ON UPDATE em um novo campo (up_City_Name) definindo a entrada City_Name como UPPER (input City_Name).
Dessa forma, você sempre saberá que seu City_Name está em letras maiúsculas, e seu servidor sempre poderá usar um índice, desde que você pesquise no novo campo up_City_Name.