Обсуждение: char column with a single space as the default not working

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

char column with a single space as the default not working

От
Sbob
Дата:
All;


I created a table like this:

create table z (charcol char(1) default  ' ', intcol int);


Then I inserted a row with a single space in the charcol column and 
another insert letting the table use the default value:

insert into z values (' ', 1);

insert into z (intcol) values (2);


However neither of the inserted rows actually retained the single space 
in the charcol column:


select '[' || charcol || ']', intcol from z;
  ?column? | intcol
----------+--------
  []       |      1
  []       |      2
(2 rows)


Thoughts? Is it possible to add a single space to a char column without 
it getting truncated?


Thanks in advance




Re: char column with a single space as the default not working

От
"David G. Johnston"
Дата:

On Thu, Nov 30, 2023 at 8:34 AM Sbob <sbob@quadratum-braccas.com> wrote:
Thoughts? Is it possible to add a single space to a char column without
it getting truncated?


Just don't use char as a data type and things will behave as you expect.


David J.

Re: char column with a single space as the default not working

От
Peter Gram
Дата:
Hi

I think it behaves as expected. Look at my select "select encode(charcol::bytea, 'hex') , intcol from z;" it returns 20 which is a space in hex

 ~/postgres/17/dev/data/ [master*] psql
psql (17devel)
Type "help" for help.
postgres PSQL> create table z (charcol char(1) default  ' ', intcol int);
CREATE TABLE
postgres PSQL> insert into z values (' ', 1);
INSERT 0 1
postgres PSQL> insert into z (intcol) values (2);
INSERT 0 1
postgres PSQL> select encode(charcol::bytea, 'hex') , intcol from z;
 encode | intcol
--------+--------
 20     |      1
 20     |      2
(2 rows)

postgres PSQL> select '[' || charcol || ']', intcol from z;
 ?column? | intcol
----------+--------
 []       |      1
 []       |      2
(2 rows)

Med venlig hilsen

Peter Gram
Sæbyholmsvej 18 
2500 Valby

Mobile: (+45) 5374 7107



On Thu, 30 Nov 2023 at 16:34, Sbob <sbob@quadratum-braccas.com> wrote:
All;


I created a table like this:

create table z (charcol char(1) default  ' ', intcol int);


Then I inserted a row with a single space in the charcol column and
another insert letting the table use the default value:

insert into z values (' ', 1);

insert into z (intcol) values (2);


However neither of the inserted rows actually retained the single space
in the charcol column:


select '[' || charcol || ']', intcol from z;
  ?column? | intcol
----------+--------
  []       |      1
  []       |      2
(2 rows)


Thoughts? Is it possible to add a single space to a char column without
it getting truncated?


Thanks in advance



Re: char column with a single space as the default not working

От
Tom Lane
Дата:
Peter Gram <peter.m.gram@gmail.com> writes:
> I think it behaves as expected. Look at my select "select
> encode(charcol::bytea, 'hex') , intcol from z;" it returns 20 which is a
> space in hex

Yeah, the space is stored.  What is probably surprising the OP
is that applying the || operator involves a coercion from "char"
to "text", which strips the defined-to-be-insignificant trailing
space(s) of the "char" value.

As David said, you're best off not using the char type.
The semantics around trailing spaces are too squishy for
my taste, and there's no real advantage compared to varchar
or text.

            regards, tom lane



Re: char column with a single space as the default not working

От
Ron Johnson
Дата:
On Thu, Nov 30, 2023 at 2:56 PM Tom Lane <tgl@sss.pgh.pa.us> wrote:
Peter Gram <peter.m.gram@gmail.com> writes:
> I think it behaves as expected. Look at my select "select
> encode(charcol::bytea, 'hex') , intcol from z;" it returns 20 which is a
> space in hex

Yeah, the space is stored.  What is probably surprising the OP
is that applying the || operator involves a coercion from "char"
to "text", which strips the defined-to-be-insignificant trailing
space(s) of the "char" value.

As David said, you're best off not using the char type.
The semantics around trailing spaces are too squishy for
my taste, and there's no real advantage compared to varchar
or text.

How do you get a trailing space when trailing spaces are significant?

Re: char column with a single space as the default not working

От
Tom Lane
Дата:
Ron Johnson <ronljohnsonjr@gmail.com> writes:
> On Thu, Nov 30, 2023 at 2:56 PM Tom Lane <tgl@sss.pgh.pa.us> wrote:
>> Yeah, the space is stored.  What is probably surprising the OP
>> is that applying the || operator involves a coercion from "char"
>> to "text", which strips the defined-to-be-insignificant trailing
>> space(s) of the "char" value.

> How do you get a trailing space when trailing spaces are significant?

Use varchar or text.  If you want trailing spaces to be significant,
char is simply the wrong data type.

            regards, tom lane



Re: char column with a single space as the default not working

От
M Sarwar
Дата:
I had the similar issue few months ago when I was using CHAR. The issue is resolved when I started using VARYING CHARACTERS data types.
Thanks,
Sarwar


From: Tom Lane <tgl@sss.pgh.pa.us>
Sent: Thursday, November 30, 2023 5:34 PM
To: Ron Johnson <ronljohnsonjr@gmail.com>
Cc: Pgsql-admin <pgsql-admin@lists.postgresql.org>
Subject: Re: char column with a single space as the default not working
 
Ron Johnson <ronljohnsonjr@gmail.com> writes:
> On Thu, Nov 30, 2023 at 2:56 PM Tom Lane <tgl@sss.pgh.pa.us> wrote:
>> Yeah, the space is stored.  What is probably surprising the OP
>> is that applying the || operator involves a coercion from "char"
>> to "text", which strips the defined-to-be-insignificant trailing
>> space(s) of the "char" value.

> How do you get a trailing space when trailing spaces are significant?

Use varchar or text.  If you want trailing spaces to be significant,
char is simply the wrong data type.

                        regards, tom lane


Re: char column with a single space as the default not working

От
Laurenz Albe
Дата:
On Thu, 2023-11-30 at 17:00 -0500, Ron Johnson wrote:
> > As David said, you're best off not using the char type.
> > The semantics around trailing spaces are too squishy for
> > my taste, and there's no real advantage compared to varchar
> > or text.
>
> How do you get a trailing space when trailing spaces are significant?

You would add a check constraint to verify it is there, and
if you want to automatically create training spaces, use a
BEFORE trigger.

Yours,
Laurenz Albe