Thread: convert char to varchar

convert char to varchar

From
Kostis Mentzelos
Date:
Hi all,
is it possible to convert character fields to character varying using
pg_dump/pg_restore?

this is my case:
I have a table with character fields:
CREATE TABLE c1 (name char(20), date char(20));
INSERT INTO c1 VALUES ('a',a');
INSERT INTO c1 VALUES ('b',b');

and another table with character varying fields:
CREATE TABLE v1 (name varchar(20), date varchar(20));

when I dump c1 and restore it to v1 my selections on v1 are failed
because the data on v1 table contains trailing spaces.
SELECT * FROM v1 WHERE name ='a'; (failed)

if I alter types on v1 to character and then back to character varying
the trailing spaces disappears and the above selection is ok.

Is there any other way to clear trailing spaces when I restore the table?

regards,
kostis.


Re: convert char to varchar

From
"Rodrigo De León"
Date:
On 10/18/07, Kostis Mentzelos <mentzelos@gmx.net> wrote:
> Is there any other way to clear trailing spaces when I restore the table?

After you restore, you can do:

UPDATE V1
SET
  NAME = TRIM(TRAILING ' ' FROM NAME)
, DATE = TRIM(TRAILING ' ' FROM DATE);

Re: convert char to varchar

From
"Peter Koczan"
Date:
> Is there any other way to clear trailing spaces when I restore the table?

If you're running 8.x, you can do this in place:

ALTER TABLE c1 ALTER COLUMN name varchar(20) USING rtrim(name), ALTER
COLUMN date varchar(20) USING rtrim(date);

This could take a long time if the table is large or has a lot of indexes on it.

Peter

Re: convert char to varchar

From
"Peter Koczan"
Date:
On 10/18/07, Peter Koczan <pjkoczan@gmail.com> wrote:
> > Is there any other way to clear trailing spaces when I restore the table?
>
> If you're running 8.x, you can do this in place:
>
> ALTER TABLE c1 ALTER COLUMN name varchar(20) USING rtrim(name), ALTER
> COLUMN date varchar(20) USING rtrim(date);
>
> This could take a long time if the table is large or has a lot of indexes on it.

Oops. The command should be:

ALTER TABLE c1 ALTER COLUMN name TYPE varchar(20) USING rtrim(name),
ALTER COLUMN date TYPE varchar(20) USING rtrim(date);

I forgot the TYPE keyword...it's important.

Peter