Mensagem de erro no MySql:
Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '='
Passei por várias outras postagens e não consegui resolver esse problema. A parte afetada é algo semelhante a isto:
CREATE TABLE users (
userID INT UNSIGNED NOT NULL AUTO_INCREMENT,
firstName VARCHAR(24) NOT NULL,
lastName VARCHAR(24) NOT NULL,
username VARCHAR(24) NOT NULL,
password VARCHAR(40) NOT NULL,
PRIMARY KEY (userid)
) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_unicode_ci;
CREATE TABLE products (
productID INT UNSIGNED NOT NULL AUTO_INCREMENT,
title VARCHAR(104) NOT NULL,
picturePath VARCHAR(104) NULL,
pictureThumb VARCHAR(104) NULL,
creationDate DATE NOT NULL,
closeDate DATE NULL,
deleteDate DATE NULL,
varPath VARCHAR(104) NULL,
isPublic TINYINT(1) UNSIGNED NOT NULL DEFAULT '1',
PRIMARY KEY (productID)
) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_unicode_ci;
CREATE TABLE productUsers (
productID INT UNSIGNED NOT NULL,
userID INT UNSIGNED NOT NULL,
permission VARCHAR(16) NOT NULL,
PRIMARY KEY (productID,userID),
FOREIGN KEY (productID) REFERENCES products (productID) ON DELETE RESTRICT ON UPDATE NO ACTION,
FOREIGN KEY (userID) REFERENCES users (userID) ON DELETE RESTRICT ON UPDATE NO ACTION
) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_unicode_ci;
O procedimento armazenado que estou usando é o seguinte:
CREATE PROCEDURE updateProductUsers (IN rUsername VARCHAR(24),IN rProductID INT UNSIGNED,IN rPerm VARCHAR(16))
BEGIN
UPDATE productUsers
INNER JOIN users
ON productUsers.userID = users.userID
SET productUsers.permission = rPerm
WHERE users.username = rUsername
AND productUsers.productID = rProductID;
END
Eu estava testando com php, mas o mesmo erro é dado com o SQLyog. Também testei recriar todo o banco de dados, mas não foi bom.
Qualquer ajuda será muito apreciada.
fonte
COLLATE utf8_unicode_ci
a constantes string:SET @EMAIL = '[email protected]' COLLATE utf8_unicode_ci;
. É especialmente útil se você estiver executando um script a partir de um console, onde a codificação padrão do console se aplica ao agrupamento das constantes de sequência.(utf8mb4_unicode_ci, IMPLICIT)
vez de(utf8_unicode_ci, IMPLICIT)
. estou raspando dados da web usando python e, em seguida, criando um arquivo CSV com os dados raspados, que depois processo com um arquivo PHP no meu servidor que carrega os dados no meu banco de dados. todas as minhas tabelas / colunas MySQL são agrupadas comoutf8mb4_unicode_ci
. o problema pode estar surgindo porque codifico os dados comoutf8
em python / csv?Passei meio dia procurando respostas para um erro idêntico "Mistura ilegal de agrupamentos" com conflitos entre utf8_unicode_ci e utf8_general_ci.
Eu descobri que algumas colunas no meu banco de dados não foram especificamente agrupadas utf8_unicode_ci . Parece que o mysql agrupou implicitamente essas colunas utf8_general_ci .
Especificamente, a execução de uma consulta 'SHOW CREATE TABLE table1' gerou algo como o seguinte:
Observe que a linha 'col1' varchar (4) CHARACTER SET utf8 NOT NULL não possui um agrupamento especificado. Em seguida, executei a seguinte consulta:
ALTER TABLE table1 CHANGE col1 col1 VARCHAR(4) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL;
Isso resolveu o erro "Mistura ilegal de agrupamentos". Espero que isso ajude alguém por aí.
fonte
COLLATE
a tabela inteira (ou sejaALTER TABLE table1 CHARSET utf8 COLLATE utf8_unicode_ci
) não resolverá o problema ; isso deve ser feito para cada coluna (problemática).Eu tive um problema semelhante, mas ocorreu-me dentro do procedimento, quando meu parâmetro de consulta foi definido usando a variável eg
SET @value='foo'
.O que estava causando isso foi incompatível
collation_connection
e agrupamento do banco de dados. Alteradocollation_connection
para combinarcollation_database
e o problema desapareceu. Eu acho que essa é uma abordagem mais elegante do que adicionar COLLATE após param / value.Resumindo: todos os agrupamentos devem corresponder. Use
SHOW VARIABLES
e certifique-secollation_connection
ecollation_database
jogo (também verificar agrupamento tabela usandoSHOW TABLE STATUS [table_name]
).fonte
SET @my_var = 'string1,string2' COLLATE utf8_unicode_ci;
Um pouco semelhante à resposta @bpile, meu caso foi uma configuração de entrada my.cnf
collation-server = utf8_general_ci
. Depois que percebi isso (e depois de tentar tudo acima), mudei com força meu banco de dados para utf8_general_ci em vez de utf8_unicode_ci e foi isso:fonte
No meu próprio caso, tenho o seguinte erro
Combinação ilegal de agrupamentos (utf8_general_ci, IMPLICIT) e (utf8_unicode_ci, IMPLICIT) para a operação '='
Após semanas de pesquisa no google, notei que os dois campos que estou comparando consistem em um nome de agrupamento diferente. O primeiro nome de usuário, ou seja, é utf8_general_ci enquanto o segundo é utf8_unicode_ci, então voltei à estrutura da segunda tabela e alterei o segundo campo (matric_no) para utf8_general_ci e funcionou como um encanto.
fonte
Apesar de encontrar um número enorme de perguntas sobre o mesmo problema ( 1 , 2 , 3 , 4 ), nunca encontrei uma resposta que levasse em consideração o desempenho, mesmo aqui.
Embora várias soluções de trabalho já tenham sido fornecidas, eu gostaria de fazer uma consideração de desempenho.
EDIT: Agradecemos à Manatax por apontar que a opção 1 não sofre problemas de desempenho.
O uso das opções
1 e2 , também conhecida como abordagem de conversão COLLATE , pode levar a um gargalo em potencial, pois qualquer índice definido na coluna não será usado, causando uma verificação completa .Embora eu não tenha experimentado a opção 3 , meu palpite é que sofrerá as mesmas consequências da opção
1 e2.Por fim, a opção 4 é a melhor opção para tabelas muito grandes quando viável. Quero dizer, não há outro uso que dependa do agrupamento original.
Considere esta consulta simplificada:
No meu exemplo original, eu tinha muito mais junções. Obviamente, tabela1 e tabela2 têm agrupamentos diferentes. Usando o operador agrupar para converter, levará a índices não sendo usados.
Veja a explicação sql na figura abaixo.
Explicação de consulta visual ao usar o elenco COLLATE
Por outro lado, a opção 4 pode tirar proveito de um possível índice e levar a consultas rápidas.
Na figura abaixo, você pode ver a mesma consulta sendo executada após a opção 4 aplicada , também conhecida como alteração do agrupamento de esquema / tabela / coluna.
Explicação de consulta visual após a intercalação ter sido alterada e, portanto, sem a conversão de intercalação
Em conclusão, se o desempenho é importante e você pode alterar o agrupamento da tabela, vá para a Opção 4 . Se você precisar atuar em uma única coluna, poderá usar algo como isto:
fonte
Isso acontece quando uma coluna é definida explicitamente para um agrupamento diferente ou o agrupamento padrão é diferente na tabela consultada.
se você tiver muitas tabelas, você deseja alterar o agrupamento ao executar esta consulta:
isso produzirá as consultas necessárias para converter todas as tabelas para usar o agrupamento correto por coluna
fonte