Обсуждение: convert char to varchar

Поиск
Список
Период
Сортировка

convert char to varchar

От
Kostis Mentzelos
Дата:
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

От
"Rodrigo De León"
Дата:
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

От
"Peter Koczan"
Дата:
> 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

От
"Peter Koczan"
Дата:
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