Acento no MySQL 5.1 (Delphi 2010 + dbExpress + Windows Xp)
Amigos,
Estou a dois dias pelejando pra resolver um problema. Ja pesquisei mas ta complicado...
O problema é a centuação de palavras no MySQL 5.1 utilizando DBExpress e Delphi 2010 no Windows XP SP3.
Se eu utilizar o navicat 8 com os campos configurados em utf8/utf8_general_ci ou latin1/latin1_swedish_ci, consigo colocar acentos e salvar sem nenhum problema. Consigo até buscar esses acentos na minha aplicação delphi com um select * from table.
O problema é que se eu atualizo ou insiro um registro via aplicação (update ou insert) onde o texto contenha acentos, o banco de dados recebe uns caracteres nada haver. Tipo assim:
insert table set nome = 'José' where codigo = 1
depois de executar, se for relizado um select nome from table where codigo = 1 eu tenho isso:
José
e isso ocorre para todos os acentos e inclusive o ç (cedilha).
Já não sei mais o que fazer pois pesquisei em diversos sites e tudo que entendi que podia ser feito não deu certo.
Alguem sabe como resolver esse problema? Seria alguma configuração de caracter na aplicação delphi?
Obrigado.
Ronaldo Araujo
Curtidas 0
Respostas
Leandro
06/02/2010
Cara da uma olhada como foi criado a codificação do banco tente criar como UTF8 ou Latin1 isso é esquema de unicode.
GOSTEI 0
Leandro
06/02/2010
esqueci de mensionar tambem. no postgres acimade 8.1 tem tambem um padrao do Brasil que é o WIN1252 pode ser que funcione.
GOSTEI 0
Ronaldo Araujo
06/02/2010
Leandro,
Obrigado pela força mas essas duas tentantivas eu ja havia feito. No navicat eu consigo colocar acento normalmente utilizando utf8 ou latin1. Ja alterei a tabela de caracteres para 1252 mas tambem não deu certo.
Eu acredito que o problema esta em alguma configuração dos componentes do dbexpress no delphi. O problema é o que?!
Continuo ainda com o problema. Se alguem tiver alguma sugestão...
Obrigado
Obrigado
GOSTEI 0
Ronaldo Araujo
06/02/2010
Depois de muita peleja e muita pesquisa, encontrei uma solução para o problema. não sei se é a melhor opção mas pelo menos funcionou corretamente.
Deixo aqui a solução caso alguem passe pelo mesmo problema. Feliz aquele que transfere o que sabe e aprende com o que ensina.
Para resolver o problema, insira a seguinte função na sua aplicação:
function StrToPChar(const Str: string): PChar;
{Converte String em Pchar}
type
TRingIndex = 0..7;
var
Ring: array[TRingIndex] of PChar;
RingIndex: TRingIndex;
Ptr: PChar;
begin
Ptr := @Str[Length(Str)];
Inc(Ptr);
if Ptr^ = #0 then
begin
Result := @Str[1];
end
else
begin
Result := StrAlloc(Length(Str)+1);
RingIndex := (RingIndex + 1) mod (High(TRingIndex) + 1);
StrPCopy(Result,Str);
StrDispose(Ring[RingIndex]);
Ring[RingIndex]:= Result;
end;
end; Depois, antes de executar a SQL na sua query vc faz o seguinte: TextoSQL := 'Update table set nome = 'josé' where codigo = 1'; SQLQuery.SQL.Text := StrToPChar(TextoSQL); SQLQuery.ExecSQL; Pronto, o comando irá gravar José com acento correto na base de dados do MySQL. Forte abraço a todos e espero que isso ajude quem precisar...
{Converte String em Pchar}
type
TRingIndex = 0..7;
var
Ring: array[TRingIndex] of PChar;
RingIndex: TRingIndex;
Ptr: PChar;
begin
Ptr := @Str[Length(Str)];
Inc(Ptr);
if Ptr^ = #0 then
begin
Result := @Str[1];
end
else
begin
Result := StrAlloc(Length(Str)+1);
RingIndex := (RingIndex + 1) mod (High(TRingIndex) + 1);
StrPCopy(Result,Str);
StrDispose(Ring[RingIndex]);
Ring[RingIndex]:= Result;
end;
end; Depois, antes de executar a SQL na sua query vc faz o seguinte: TextoSQL := 'Update table set nome = 'josé' where codigo = 1'; SQLQuery.SQL.Text := StrToPChar(TextoSQL); SQLQuery.ExecSQL; Pronto, o comando irá gravar José com acento correto na base de dados do MySQL. Forte abraço a todos e espero que isso ajude quem precisar...
GOSTEI 0
Emerson Nascimento
06/02/2010
se a solução é passar a string como PChar, porque não sar a função PChar() do Delphi?
TextoSQL := 'Update table set nome = 'josé' where codigo = 1'; SQLQuery.SQL.Text := PChar(TextoSQL); SQLQuery.ExecSQL;
TextoSQL := 'Update table set nome = 'josé' where codigo = 1'; SQLQuery.SQL.Text := PChar(TextoSQL); SQLQuery.ExecSQL;
GOSTEI 0