Pesquisa sensível caso MYSQL para o campo utf8_bin
-
05-09-2019 - |
Pergunta
Eu criei uma tabela e definir o agrupamento de utf8 , a fim de ser capaz de adicionar um índice exclusivo para um campo. Agora eu preciso fazer caso pesquisas insensíveis, mas quando eu executei algumas consultas com a palavra chave de agrupamento e eu tenho:
mysql> select * from page where pageTitle="Something" Collate utf8_general_ci;
ERRO 1253 (42000): COLLATION 'utf8_general_ci' não é válido para CHARACTER SET 'latin1'
mysql> select * from page where pageTitle="Something" Collate latin1_general_ci;
ERROR 1267 (HY000): mistura ilegal de agrupamentos (utf8_bin, implícita) e (Latin1_general_ci, explícito) para a operação '='
Eu sou muito novo para SQL, então eu queria saber se alguém poderia ajudar.
Solução
Uma cadeia em MySQL tem uma href="http://dev.mysql.com/doc/refman/5.0/en/charset.html" rel="noreferrer"> conjunto de caracteres . Utf8 é o conjunto de caracteres e utf8_bin é um dos seus agrupamentos. Para comparar o seu literal cadeia de caracteres para uma coluna utf8, convertê-lo para UTF-8 pré-fixando com a notação _charset:
_utf8 'Something'
Agora, um agrupamento só é válida para alguns conjuntos de caracteres. O caso- sensível agrupamento para utf8 parece ser utf8_bin, que você pode especificar como:
_utf8 'Something' collate utf8_bin
Com essas conversões, a consulta deve funcionar:
select * from page where pageTitle = _utf8 'Something' collate utf8_bin
O prefixo _charset trabalha com strings literais. Para alterar o conjunto de caracteres de um campo, há CONVERTER ... USAR. Isso é útil quando você quiser converter o campo pageTitle para outro conjunto de caracteres, como em:
select * from page
where convert(pageTitle using latin1) collate latin1_general_cs = 'Something'
Para ver o caráter e de agrupamento para uma coluna chamada 'col' em uma tabela chamada 'TAB', tente:
select distinct collation(col), charset(col) from TAB
A lista de todos os conjuntos de caracteres e collations pode ser encontrado com:
show character set
show collation
E todos os agrupamentos válidos para utf8 pode ser encontrado com:
show collation where charset = 'utf8'
Outras dicas
Por favor note também que, em caso de utilização de "Agrupar utf8_general_ci" ou "Agrupar latin1_general_ci", ou seja, "força" ordenação - como uma conversão irá impedir de uso de índices existentes! Este poderia ser um gargalo no futuro para o desempenho.
Tente isso, seu trabalho para mim
SELECT * FROM users
ONDE UPPER (name
) = UPPER ( 'José') COLLATE utf8_bin;
Posso perguntar por que você tem uma necessidade de alterar explicitamente o agrupamento quando você faz um SELECT? Porque não basta agrupamento do jeito que você quer para recuperar os registros quando ordenado?
O problema que você está tendo com suas pesquisas sendo maiúsculas e minúsculas é que você tem um agrupamento binário. Tente em vez de usar o agrupamento geral. Para mais informações sobre a sensibilidade caso e agrupamentos, veja aqui: caso sensibilidade na corda Pesquisas