bucanero
28-01-2016, 18:34:25
hola,
tengo una tabla en una B.D. de MySQL con un campo de tipo longText, e intento guardar el contenido de ciertos ficheros de texto. En la mayoría de los casos esta información se almacena sin ningún tipo de problemas, pero en los ficheros que contienen caracteres `especiales` de nuestro idioma :-) como acentos y ñ, lo que se guarda son caracteres raros, como si fallase el codePage.
La B.D. la tengo configurada en UNICODE y las campos también, aquí dejo la definición de la tabla
CREATE TABLE `filedata` (
`id` int(11) NOT NULL,
`stream` longtext COLLATE utf8_unicode_ci,
`datos` varchar(65) COLLATE utf8_unicode_ci NOT NULL DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
En cuanto a la conexión a la BBDD la realizo a través de ZEOS con DELPHI XE7 y el código que utilizo para subir un determinado fichero es:
procedure TForm1.LoadFile(const fileName: string);
var
fs:TStreamReader;
begin
try
fs:=TStreamReader.Create(filename, true);
try
saveFile(fs.BaseStream);
finally
fs.Free
end;
except
on E: Exception do
memo1.lines.add(E.message);
end;
end;
procedure TForm1.saveFile(stream: TStream);
begin
with ZTable1 do
try
try
Insert;
FieldByName('datos').Value:='áéíóú';
with CreateBlobStream(FieldByName('stream'), bmWrite) do
try
Seek(0, soFromBeginning);
CopyFrom(stream, stream.Size);
finally
Free
end;
finally
if State in [dsEdit, dsInsert] then
post;
end;
except
on e: Exception do begin
if state in [dsEdit, dsInsert] then
Cancel;
memo1.lines.add(E.message);
end;
end;
end;
Entre las muchas pruebas que ya he realizado sin muchos resultados, he intentado definiendo las propiedades de conexión del ZEOS los parametros de codepage y character_set sin obtener mejores resultados.
codepage = utf8;
character_set_database = utf8_unicode_ci;
Y al monitorizar la consultas que se envían al servidor ya se observan los datos mal como se puede comprobar en esta consulta:
INSERT INTO filedata (id,stream,datos) VALUES (NULL,'?????????????????????????†???????????????????????????†??†?????????†?????????????????††??????? ???????????†?†††???????????†††???????????????†???','áéíóú')
Aunque curiosamente los datos de prueba introducidos en esta linea se graban sin problemas y se ven correctamente incluidos los acentos
FieldByName('datos').Value:='áéíóú';
por lo que ya no se por donde seguir probando.
¿Puede que se trate de uno de los muchos bugs de ZEOS?
Alguien que me pueda hechar una mano.
Un saludo
tengo una tabla en una B.D. de MySQL con un campo de tipo longText, e intento guardar el contenido de ciertos ficheros de texto. En la mayoría de los casos esta información se almacena sin ningún tipo de problemas, pero en los ficheros que contienen caracteres `especiales` de nuestro idioma :-) como acentos y ñ, lo que se guarda son caracteres raros, como si fallase el codePage.
La B.D. la tengo configurada en UNICODE y las campos también, aquí dejo la definición de la tabla
CREATE TABLE `filedata` (
`id` int(11) NOT NULL,
`stream` longtext COLLATE utf8_unicode_ci,
`datos` varchar(65) COLLATE utf8_unicode_ci NOT NULL DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
En cuanto a la conexión a la BBDD la realizo a través de ZEOS con DELPHI XE7 y el código que utilizo para subir un determinado fichero es:
procedure TForm1.LoadFile(const fileName: string);
var
fs:TStreamReader;
begin
try
fs:=TStreamReader.Create(filename, true);
try
saveFile(fs.BaseStream);
finally
fs.Free
end;
except
on E: Exception do
memo1.lines.add(E.message);
end;
end;
procedure TForm1.saveFile(stream: TStream);
begin
with ZTable1 do
try
try
Insert;
FieldByName('datos').Value:='áéíóú';
with CreateBlobStream(FieldByName('stream'), bmWrite) do
try
Seek(0, soFromBeginning);
CopyFrom(stream, stream.Size);
finally
Free
end;
finally
if State in [dsEdit, dsInsert] then
post;
end;
except
on e: Exception do begin
if state in [dsEdit, dsInsert] then
Cancel;
memo1.lines.add(E.message);
end;
end;
end;
Entre las muchas pruebas que ya he realizado sin muchos resultados, he intentado definiendo las propiedades de conexión del ZEOS los parametros de codepage y character_set sin obtener mejores resultados.
codepage = utf8;
character_set_database = utf8_unicode_ci;
Y al monitorizar la consultas que se envían al servidor ya se observan los datos mal como se puede comprobar en esta consulta:
INSERT INTO filedata (id,stream,datos) VALUES (NULL,'?????????????????????????†???????????????????????????†??†?????????†?????????????????††??????? ???????????†?†††???????????†††???????????????†???','áéíóú')
Aunque curiosamente los datos de prueba introducidos en esta linea se graban sin problemas y se ven correctamente incluidos los acentos
FieldByName('datos').Value:='áéíóú';
por lo que ya no se por donde seguir probando.
¿Puede que se trate de uno de los muchos bugs de ZEOS?
Alguien que me pueda hechar una mano.
Un saludo