| From: | Samuel Gilbert <samuel(dot)gilbert(at)ec(dot)gc(dot)ca> | 
|---|---|
| To: | pgsql-general(at)postgresql(dot)org | 
| Subject: | COPY statement REAL vs VARCHAR precision issue | 
| Date: | 2011-02-10 17:13:33 | 
| Message-ID: | 201102101213.33812.samuel.gilbert@ec.gc.ca | 
| Views: | Whole Thread | Raw Message | Download mbox | Resend email | 
| Thread: | |
| Lists: | pgsql-general | 
Hello all,
  I'm using a COPY statement to load data into a PostGIS.  The issue I am 
facing is that if I define fields with the REAL type, the COPY will only 
preserve 4 decimals which is not sufficient for my application.
Here is the commands I'm running and a sample of the results :
CREATE TABLE sites (
   id VARCHAR(9) PRIMARY KEY,
   name VARCHAR(128),
   type VARCHAR(1),
   agency VARCHAR(128),
   status INTEGER,
   napsDesignated BOOLEAN,
   address VARCHAR(128),
   city VARCHAR(128),
   network VARCHAR(128),
   timeZone REAL,
   lat REAL,
   lon REAL,
   elevation REAL
);
COPY sites (
   id,
   name,
   type,
   agency,
   status,
   napsDesignated,
   address,
   city,
   network,
   timeZone,
   lat,
   lon,
   elevation
) FROM
   '/data/sites.csv'
WITH DELIMITER '|' CSV HEADER;
-- Then I use some PostGIS functions to convert the lat/lon into a geometry
-- The issue is independent of the GIS processing.
SELECT lat, lon FROM sites LIMIT 4;
--    lat   |   lon    
-- ---------+----------
--  47.5681 | -52.7022
--    47.56 | -52.7114
--  49.3208 | -57.3972
--  48.9495 | -57.9454
-- (4 rows)
-- If I define the fields as being VARCHAR instead of REAL, I get all
-- the decimals :
CREATE TABLE sites (
   id VARCHAR(9) PRIMARY KEY,
   name VARCHAR(128),
   type VARCHAR(1),
   agency VARCHAR(128),
   status INTEGER,
   napsDesignated BOOLEAN,
   address VARCHAR(128),
   city VARCHAR(128),
   network VARCHAR(128),
   timeZone REAL,
   lat VARCHAR(32),
   lon VARCHAR(32),
   elevation REAL
);
COPY sites (
   id,
   name,
   type,
   agency,
   status,
   napsDesignated,
   address,
   city,
   network,
   timeZone,
   lat,
   lon,
   elevation
) FROM
   '/data/sites.csv'
WITH DELIMITER '|' CSV HEADER;
SELECT lat, lon FROM sites LIMIT 4;
       lat        |        lon        
------------------+-------------------
 47.5680555555556 | -52.7022222222222
 47.56            | -52.7113888888889
 49.3208333333333 | -57.3972222222222
 48.949479        | -57.945387
(4 rows)
-- When I convert the lat/lon to GEOMETRY, the function takes a string as 
input.  Therefore, the precision depends on how the REAL are converted to 
strings. :
UPDATE sites SET
   position = GeomFromEWKT('SRID=4326;POINT(' || lon || ' ' || lat ||' ' || 
elevation || ')');
-- Are the values stored with all the possible precision of a REAL or are they 
stored as displayed?
-- Is it because of the behaviour of the COPY statement?
Thank you for your help!
Samuel
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Wappler, Robert | 2011-02-10 17:45:25 | Re: GUC configuration | 
| Previous Message | Tom Lane | 2011-02-10 17:10:47 | Re: 9.0.X FOR UPDATE|SHARE on Sub-Query Causes "cannot extract system attribute from virtual tuple" if Sub-Query Returns Records (BUG) |