Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Como evitar los espacios blancos fantasma?? (https://www.clubdelphi.com/foros/showthread.php?t=80977)

Aurepilo 28-09-2012 19:41:10

Como evitar los espacios blancos fantasma??
 
Os cuento , trabajo con ACCESS y adoquery. Creo la siguiente tabla de forma dinámica:
Código:

begin
    WITH ADOQUERY1 DO
    BEGIN
    Close;
        with SQL do
      begin
        Clear;
        Add('create table '+taula+' (');
        Add('IdFactura autoincrement,');
        Add('IdCliente STRING,');
        Add('IdEmpleado string,');
        Add('IdDocumento string,');
        Add('FechaFactura  datetime,');
        Add('CantidadTotal      currency,');
        Add('Cliente  char(30),');
        Add('Referencia  char(30),');
        Add('Conceptes  char(30),');
        Add('IVA  char(30),');
        Add('NumFactura  string,');
        Add('NumFac  int DEFAULT 1,');
        Add('Pagada    yesno,');
        Add('primary key (IdFactura))');
      end;
        try
      ExecSQL;
    except

Por alguna razón, cuando añado datos a traves de INSERT o UPDATE, estos se incrementan con un monton de espacios en blanco... eso es un problema porque si hago un SELECT filtrando los datos con WHERE nunca me encuentra el registro en cuestión porque, evidentemente, los datos no coinciden. Porqué ocurre eso? como se puede evitar?

Casimiro Noteví 28-09-2012 20:17:46

No sé con access, pero en otros sistemas el tipo char rellena de espacios, y el tipo varchar lo "limpia".
Quiere decir que en lugar de usar, ejemplo: nombre char(30) debes usar nombre varchar(30)

Delphius 28-09-2012 21:05:12

Cita:

Empezado por Casimiro Notevi (Mensaje 445728)
No sé con access, pero en otros sistemas el tipo char rellena de espacios, y el tipo varchar lo "limpia".
Quiere decir que en lugar de usar, ejemplo: nombre char(30) debes usar nombre varchar(30)

No es que lo limpie sino que varchar es de tamaño variable, ajustando el campo según el contenido del texto. Cuando uno declara al campo varchar le está indicando el tamaño máximo para el campo.
De este modo, por ejemplo ante un campo varchar(30) si para un registro guardamos un texto de 10 caracteres, el tamaño del campo para éste será de 10 y no se desperdicia memoria.

Por su parte el char reserva directamente ese tamaño de memoria de modo que si guardamos contenido de menos caracteres, se llena totalmente el texto de "espacios" hasta la totalidad del campo.

Es mejor hacer esta aclaración antes de que llamar "limpiar" ¿no crees? ;)

Saludos,

Casimiro Noteví 28-09-2012 21:27:26

Tienes toda la razón, además de que sé perfectamente que es así, tal y como has explicado.
Como se dice habitualmente: se me ha ido la pinza :D

roman 28-09-2012 21:47:20

De todas formas, este tipo de cosas suceden con Access pero no con otros motores. Aunque un tipo char(30) ocupe un espacio fijo de 30 caracteres en la base de datos, esto no quiere decir que el valor devuelto enn una consulta SQL tenga la cadena rellena de espacios.

// Saludos

AzidRain 29-09-2012 00:15:25

Estas en lo cierto Roman. Parece que solo Access hace eso, copiado del viejo estandar de xBASE donde cada registro debía tener el mismo número de bytes, por lo que campos tipo char que ocuparan menos del tamaño declarado, en efecto se rellenaban con espacios para cumplir con la regla. Ah que tiempos aquellos...


La franja horaria es GMT +2. Ahora son las 03:50:59.

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