Estou recebendo esse erro estranho ao processar um grande número de dados ...
Error Number: 1267
Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='
SELECT COUNT(*) as num from keywords WHERE campaignId='12' AND LCASE(keyword)='hello again 昔 ã‹ã‚‰ ã‚ã‚‹ å ´æ‰€'
O que posso fazer para resolver isso? Posso escapar da string de alguma forma para que esse erro não ocorra ou preciso alterar a codificação da minha tabela de alguma forma? Em caso afirmativo, para que devo alterá-la?
mysql
sql
mysql-error-1267
Click Voto a favor
fonte
fonte
Respostas:
então para seus bancos de dados
O MySQL foge sueco algumas vezes sem nenhuma razão sensata.
fonte
Você deve definir sua codificação de tabela e codificação de conexão para
UTF-8
:e
fonte
myDb
PADRÃO PERSONALIZADO SET utf8 COLLATE utf8_bin. Isso funcionaria? Isso é feito para que todas as minhas tabelas sejam afetadas, e não apenas uma delas.Resolve meu problema. Onde column1 é a coluna que me dá esse erro.
fonte
Use a seguinte instrução para erro
tenha cuidado com seus dados, faça backup se houver dados na tabela.
fonte
Em geral, a melhor maneira é alterar o agrupamento da tabela. No entanto, tenho um aplicativo antigo e não sou capaz de estimar o resultado se isso tem efeitos colaterais. Portanto, tentei de alguma forma converter a string em outro formato que resolvesse o problema de agrupamento. O que eu achei trabalhando é fazer a comparação de cadeias, convertendo as cadeias em uma representação hexadecimal de seus caracteres. No banco de dados, isso é feito com o
HEX(column).
PHP, você pode usar esta função:Ao fazer a consulta ao banco de dados, sua string UTF8 original deve ser convertida primeiro em uma string iso (por exemplo, usando
utf8_decode()
no PHP) antes de usá-la no banco de dados. Devido ao tipo de intercalação, o banco de dados não pode ter caracteres UTF8, portanto o comparismo deve funcionar, embora isso altere a cadeia original (a conversão de caracteres UTF8 que não existem no conjunto de caracteres ISO resulta em? Ou estes são removidos completamente). Apenas certifique-se de que, ao gravar dados no banco de dados, use a mesma conversão UTF8 em ISO.fonte
Minha tabela foi criada originalmente com CHARSET = latin1 . Após a conversão da tabela para utf8, algumas colunas não foram convertidas, no entanto, isso não era realmente óbvio. Você pode tentar executar
SHOW CREATE TABLE my_table;
e ver qual coluna não foi convertida ou apenas corrigir o conjunto de caracteres incorreto na coluna problemática com a consulta abaixo (altere o comprimento do varchar e CHARSET e COLLATE de acordo com suas necessidades):fonte
Altere o conjunto de caracteres da tabela para utf8
fonte
Depois de fazer as correções listadas na resposta superior, altere as configurações padrão do seu servidor.
No seu " /etc/my.cnf.d/server.cnf " ou em qualquer outro local, adicione os padrões à seção [mysqld] para que fique assim:
Fonte: https://dev.mysql.com/doc/refman/5.7/en/charset-applications.html
fonte
Eu descobri que usar
cast()
era a melhor solução para mim:Há também uma
convert()
função. Mais detalhes aquiOutro recurso aqui
fonte
Minha conta de usuário não tinha permissões para alterar o banco de dados e a tabela, conforme sugerido nesta solução .
Se, como eu, você não se importar com o agrupamento de caracteres (você está usando o operador '='), poderá aplicar a correção inversa. Execute isso antes do seu SELECT:
fonte