Jump to content
nunopicado

Charsets, Collations e Subquerys... Mais um desafio! ;)

Recommended Posts

nunopicado

Boas

Estou aqui com outro problema numas querys, embora a raíz do dito possa até vir de trás, nomeadamente das configurações das collations...

É o seguinte:

Tenho o MySQL server em Windows (UniServer). Todas as minhas tabelas estão configuradas no server como UTF8_general_ci.

Tenho como manager o HeidiSQL, que nos scripts de arranque tem um "SET NAMES Latin1", caso contrário, não me mostra correctamente os acentos e cedilhas...

Tenho por fim um software que estou a criar, que até agora tem tratado sem problemas os caracteres portugueses. O componente de acesso é o ZeosLIB (Delphi) que está configurado como UTF8. Como eu disse, funciona OK.

No entanto precisei agora de fazer uma query um pouco mais complexa (pelo menos para mim).

Trata-se de aceder a uma tabela em que dois dos campos são referencias ao ID de uma segunda tabela.

Tentei fazer isto com um Inner Join, mas não funcionou, aparentemente porque ele está a tentar puxar records diferentes da 2ª tabela para cada um dos campos que referi.

Consegui resolver o problema com duas subquerys, ficando a query assim:

SELECT Mensagens.id,Lida,Concluida,Prioritaria,Anulada,(SELECT User From Users where Users.ID=Mensagens.De) as DeUser,
(SELECT User From Users where Users.ID=Mensagens.Para) as ParaUser,Assunto,CONCAT(DataEnvio," ",HoraEnvio) AS DataHoraEnvio,
CONCAT(DataLeitura," ",HoraLeitura) AS DataHoraLeitura,CONCAT(DataConclusao," ",HoraConclusao) AS  DataHoraConclusao,
Corpo,DataEnvio,HoraEnvio,DataLeitura,HoraLeitura,DataConclusao,HoraConclusao,De,Para FROM Mensagens 

Com isto consegui os campos necessários (o nome de Mensagens.De contido em Users.User; o nome de Mensagens.Para contido em Users.User e os campos Dataxxxxxx e Horaxxxxxx unidos num só campo, separados apenas por um espaço).

O problema é que nos campos criados pelas subquerys, DeUser e ParaUser, os nomes que tenham caracteres portugueses aparecem-me baralhados, não conseguindo fazer as cedilhas e acentos.

Estou completamente sem ideias... É possível dar a volta a isto?

Imagino que o problema esteja nas configurações, por causa da cena ridícula de ter configurado as bases de dados como UTF8 e ter de meter Latin1 no Heidi para ver correctamente, mas não sei como resolver esse problema...

Toda a ajuda é bem vinda! Obrigado!


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
nunopicado

Boas brunoais

Obrigado pela resposta, mas infelizmente penso que não me resolve a situação, visto que estou a trabalhar em Delphi e essa função é PHP.

Talvez resolvesse uma função do género no próprio MySQL (em Delphi não é opção, pois a DBGrid que uso para mostrar os dados é preenchida automaticamente pelo componente de acesso ao MySQL - ou trocava tudo, ou não troca nada).

A única maneira de fazer isto no Delphi seria uma batota, que é o que estou a usar neste momento, ou seja, durante o preenchimento da DBGrid, capturar o evento de escrita na célula respectiva, e escrever por cima outro valor. Ao escrever a célula, ele executa uma query temporaria e vai buscar o valor correcto à tabela Users (query directa, e não sub-query) e escreve-o em cima do que a primeira query lhe atribuiu.

No entanto isto levanta outros problemas, tanto a nivel de performance (são duas querys a mais por cada registo, para cada vez que ele "pinta" a DBGrid) que por agora não são importantes porque a base de dados ainda tem pouco registos, mas que no futuro pode fazer influência negativa; como de cada vez que preciso aceder aos valores da query, por exemplo para imprimir, em que tenho de voltar a efectuar as tais querys temporarias...

Digamos que é uma solução coxa, que preferia ver substituida por uma mais ortodoxa, ou seja, o servidor MySQL dar correctamente os dados que lhe são pedidos... :P

De qualquer modo, agradeço a dica...

Abraço

Nuno Picado


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.