zero char is returned as space

Started by Konstantin Izmailovalmost 4 years ago3 messages
#1Konstantin Izmailov
pgfizm@gmail.com

Hi,
could you help me understand if this is an intended behaviour, or I'm
incorrectly querying a "char" field? I have simple table with column
declared as:
c_tinyint char NOT NULL

The column contains tiny integers in range 0-10. When I query the column
from my app using libpq values 1-10 are returned correctly as 0x1-0x10. But
value of zero is returned as 0x20 (expected 0x0).
The pgAdmin displays result of the query
SELECT c_tinyint, ascii(c_tinyint) FROM tbl
as shown below:
| c_tinyint | ascii |
| character(1) | integer |
| | 0 |
| | 1 |
| | 2 |
| | 3 |
| | 4 |

Thank you
K

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Konstantin Izmailov (#1)
Re: zero char is returned as space

Konstantin Izmailov <pgfizm@gmail.com> writes:

could you help me understand if this is an intended behaviour, or I'm
incorrectly querying a "char" field?

We do not support '\0' as an element of a string value. You didn't
show how you're trying to insert this value, but I suspect that
Postgres saw it as an empty string which it then space-padded to
length 1 because that's what char(1) does.

Don't use a string field to store an integer. What with the need
for a length header, you wouldn't be saving any space compared to
"smallint" even if there weren't any semantic issues.

regards, tom lane

#3Konstantin Izmailov
pgfizm@gmail.com
In reply to: Tom Lane (#2)
Re: zero char is returned as space

Tom,
thank you very much! It makes sense now.

K

On Tue, Apr 5, 2022 at 10:08 PM Tom Lane <tgl@sss.pgh.pa.us> wrote:

Show quoted text

Konstantin Izmailov <pgfizm@gmail.com> writes:

could you help me understand if this is an intended behaviour, or I'm
incorrectly querying a "char" field?

We do not support '\0' as an element of a string value. You didn't
show how you're trying to insert this value, but I suspect that
Postgres saw it as an empty string which it then space-padded to
length 1 because that's what char(1) does.

Don't use a string field to store an integer. What with the need
for a length header, you wouldn't be saving any space compared to
"smallint" even if there weren't any semantic issues.

regards, tom lane