Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 28-01-2016
bucanero bucanero is offline
Miembro
 
Registrado: nov 2013
Ubicación: Almería, España
Posts: 208
Poder: 11
bucanero Va camino a la fama
Error al guardar en una tabla un stream que contenga acentos

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

Código SQL [-]
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:
Código Delphi [-]
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.

Código Delphi [-]
    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:
Código SQL [-]
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
Código Delphi [-]
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
Responder Con Cita
  #2  
Antiguo 29-01-2016
CSIE CSIE is offline
Miembro
 
Registrado: feb 2008
Ubicación: Universo paralelo
Posts: 69
Poder: 17
CSIE Va por buen camino
¿El fichero de texto es ANSI?
Responder Con Cita
  #3  
Antiguo 29-01-2016
bucanero bucanero is offline
Miembro
 
Registrado: nov 2013
Ubicación: Almería, España
Posts: 208
Poder: 11
bucanero Va camino a la fama
Gracias CSIE por responder,

En principio se tratan de ficheros planos de texto, en formato ANSI.

En distintas pruebas que he realizado para descartar el error, la lectura del fichero con el componente StreamReader es correcta, puesto que si vuelco el contenido de dicho StreamReader a un MEMO estos datos se ve perfectamente.

Sigo achacandolo a un bugs de ZEOS en particular en el CreateBlobStream, puesto que haciendo pruebas utilice los componentes de FIREDAC y utilizando la misma estructura de programa y datos que ya tengo todo funciono correctamente

Gracias de nuevo por el tiempo empleado

Un saludo
Responder Con Cita
  #4  
Antiguo 30-01-2016
CSIE CSIE is offline
Miembro
 
Registrado: feb 2008
Ubicación: Universo paralelo
Posts: 69
Poder: 17
CSIE Va por buen camino
Cita:
Empezado por bucanero Ver Mensaje
Gracias CSIE por responder,

En distintas pruebas que he realizado para descartar el error, la lectura del fichero con el componente StreamReader es correcta, puesto que si vuelco el contenido de dicho StreamReader a un MEMO estos datos se ve perfectamente.

Un saludo
Eso no significa que esté bien.

Estás trabajando en todo momento con streams por lo que nuca se produce la conversión de ANSI a Unicode, el parámetro "stream" del método saveFile contiene un string ANSI, si luego te limitas a copiar (CopyFrom) este raw de bits a otro stream estarás copiando una cadena ANSI a una zona de memoria unicode,

Código Delphi [-]
CopyFrom(stream, stream.Size);

stream.Size será la longitud de una cadena ANSI no unicode, en cuanto a

Código Delphi [-]
FieldByName('datos').Value:='áéíóú';

estás asignando una cadena delphi (XE7) que es Unicode
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
guardar dato en una BD que contenga datos con sud índice y superindice gulder Varios 2 02-07-2008 17:14:36
sacar lo inverso de lainformacion que contenga la tabla richy08 MS SQL Server 2 18-07-2007 17:01:17
Quisiera guardar los datos de un Query en un stream David Conexión con bases de datos 1 21-05-2007 20:53:26
Error al guardar modificaciones tabla paradox Sayuri Tablas planas 2 29-07-2005 21:48:10
Como almaceno un Stream en una Tabla? juliopag1 Varios 9 22-06-2005 17:35:03


La franja horaria es GMT +2. Ahora son las 19:44:52.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi