none
Erro no select usando UNION RRS feed

  • Pergunta

  • Olá pessoal, no MySql, essa instrução deu certo:
    SELECT -1 as ID, '*** TODOS ***' AS CLI_NOME UNION SELECT ID, CLI_NOME FROM CLIENTES ORDER BY CLI_NOME;

    Illegal mix of collations (latin1_swedish_ci,COERCIBLE) and (utf8_general_ci,IMPLICIT) for operation 'UNION'

    No código, estou fazendo assim:

    string codigo = "ID";
    string tabela = "CLIENTES";
    string descricao = "CLI_NOME";

    DataTable dt = new DataTable();
    bd = new AcessoBancoDados();
    bd.Conectar();

    string sql = "SELECT -1 as " + codigo + ',' + "'*** TODOS *** '" + " AS CLI_NOME UNION SELECT " + codigo + "," + descricao + " FROM " + tabela + " ORDER BY CLI_NOME";

    DataSet dados = new DataSet();
    adaptador.Fill(dados, tabela);  <--- Erro nessa linha
    meucombo.DataSource = dados.Tables[tabela];
    meucombo.DisplayMember = descricao;
    meucombo.ValueMember = codigo;

    No MySql, está dando certo, mas pelo código está dando erro na linha indicada:

    Illegal mix of collations (latin1_swedish_ci,COERCIBLE) and (utf8_general_ci,IMPLICIT) for operation 'UNION'

    C#, WindowsForm.

    sábado, 4 de abril de 2020 12:15

Respostas

  • Então esse pode ser o B.O. O banco não faz union de collations diferentes.

    Você pode forçar o collation:
    https://dev.mysql.com/doc/refman/8.0/en/charset-collate.html

    Tente algo tipo:
    string sql = "SELECT -1 as " + codigo + ',' + "'*** TODOS *** '"
     + " AS CLI_NOME UNION SELECT " + codigo + "," + descricao + " COLLATE latin1_swedish_ci AS CLI_NOME FROM " + tabela + " ORDER BY CLI_NOME";

    • Marcado como Resposta Porter Porter segunda-feira, 6 de abril de 2020 20:41
    sábado, 4 de abril de 2020 20:02

Todas as Respostas

  • Qual collation default do seu banco e qual collation da sua tabela CLIENTE?

    Att

    sábado, 4 de abril de 2020 13:00
  • Olá Eliézer, com o comando SHOW TABLE STATUS, verifiquei que a tabela CLIENTES é utf8_general_ci, mas tem outras tabelas que são latin1_swedish_ci.
    sábado, 4 de abril de 2020 13:30
  • Faltou o collation default:

    show variables like "collation_database";

    collation_database    latin1_swedish_ci

    sábado, 4 de abril de 2020 14:07
  • Então esse pode ser o B.O. O banco não faz union de collations diferentes.

    Você pode forçar o collation:
    https://dev.mysql.com/doc/refman/8.0/en/charset-collate.html

    Tente algo tipo:
    string sql = "SELECT -1 as " + codigo + ',' + "'*** TODOS *** '"
     + " AS CLI_NOME UNION SELECT " + codigo + "," + descricao + " COLLATE latin1_swedish_ci AS CLI_NOME FROM " + tabela + " ORDER BY CLI_NOME";

    • Marcado como Resposta Porter Porter segunda-feira, 6 de abril de 2020 20:41
    sábado, 4 de abril de 2020 20:02
  • Realmente o problema era no COLLATE da tabela, mudei para latin1_swedish_ci e deu certo mesmo com a tabela já populada, agora preciso fazer a mesma mudança lá no cliente mas tenho receio de que possa aparecer algum problema, nunca fiz uma mudança dessa.
    segunda-feira, 6 de abril de 2020 18:08