caso MYSQL pesquisa sensível para campo utf8_bin

votos
18

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;

ERROR 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;

ERRO 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.

Publicado 23/05/2009 em 08:23
fonte usuário
Em outras línguas...                            


4 respostas

votos
40

Uma string no MySQL tem um conjunto de caracteres e um agrupamento . Utf8 é o conjunto de caracteres e utf8_bin é um dos seus agrupamentos. Para comparar a sua string literal a 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 de agrupamento para utf8 parece estar 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

Uma 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'
Respondeu 23/05/2009 em 08:55
fonte usuário

votos
2

Tente isso, seu trabalho para mim

SELECT * DE usersONDE UPPER ( name) = UPPER ( 'josé') CONFERIR utf8_bin;

Respondeu 23/12/2015 em 11:22
fonte usuário

votos
2

Também por favor note que no caso de usar "Agrupar utf8_general_ci" ou "Agrupar latin1_general_ci", isto é, "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.

Respondeu 18/05/2013 em 16:38
fonte usuário

votos
1

Posso perguntar por que você tem uma necessidade de alterar explicitamente o agrupamento quando você faz um SELECT? Porque não basta reunir na forma como você deseja 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: Sensibilidade Caso em corda Pesquisas

Respondeu 23/05/2009 em 08:52
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more