segunda-feira, 2 de agosto de 2010

Acentos no MySQL - Comandos CAST e CONVERT

Problemas em relação aos seguintes comandos SQL:
  1. CONCAT_WS(' - ',coluna1,coluna2)
  2. CONCAT(coluna1,' - ',coluna2)
  3. CAST(CONCAT_WS(' - ',coluna1,coluna2) AS CHAR)
  4. CONVERT(CONCAT_WS(' - ',coluna1,coluna2), CHAR)
Os dois primeiros me retornavam um campo BLOB e os dois últimos (que eu pensava serem soluções) não me retornavam as palavras acentuadas..

Solução:
  • CONCAT_WS(' - ',CAST(coluna1 AS CHAR),coluna2)
Onde:
  • coluna1 é do tipo INT;
  • coluna 2 é do tipo VARCHAR;
Cenário:

Hoje apanhei um pouco deste problema!

Precisava preencher uma lista de opções usando duas colunas de uma tabela, com a seguinte estrutura:
"[coluna1] - [coluna2]", por exemplo: "3 - Sala de Reuniões".
Pensei: FÁCIL! Fui direto na opção 1 (acima) ... #fail ... Na esperança, tentei a opção 2 ... #fail again...

Visitei diversos sites na internet - incluindo o de documentação do MySQL e a de relatos de bugs no MySQL - e percebi que muitos que reclamavam deste comportamento estavam misturando colunas numéricas e alfanuméricas (como era o meu caso, já que uma de minhas colunas é do tipo INT e a outra VARCHAR).

Resolvi tentar converter o resultado final, foi quando tentei as opções 3 e 4... Outro problema, agora não apareciam as letras acentudas, no lugar apenas uma interrogação... Mais uma navegada na internet e nada, tentei mudar o character_set usando CAST e alterando o tipo de character_set e collation, como em:
CAST(CONCAT(coluna1,' - ',coluna2) AS CHAR CHARACTER SET utf8) COLLATE utf8_bin

Tentei diversos character_set e collation mas ... nada! Até que resolvi não mais converter o resultado final, e sim a coluna do tipo INT e ... Voilà! Mais uma pro Baú do Raul!

Abraço a todos!

2 comentários:

  1. Cara, um SALVE pra ti, eu estava com o mesmo problema, tentei as mesmas soluções, e, em uma última googleada, teu post foi o primeiro da lista e o primeiro que realmente me ajudou.

    Valeu!

    ResponderExcluir
  2. Parabéns!!! Muito mais fácil que eu imaginava e funcionou.

    ResponderExcluir