Thread: insert char(1) type by different ways.

insert char(1) type by different ways.

From
"And. Andruikhanov"
Date:
Good day.

System Configuration
---------------------
  Architecture: Intel Pentium

  Operating System: 4.2-STABLE FreeBSD

  PostgreSQL version:   PostgreSQL-7.0.2

  Compiler used:  gcc 2.95.2

Description of problem
----------------------

It's some differences in results, then I inserted char(1) type. I introduce one
example:

create table ku(n_pp int4, col char(1));

insert into ku values(1, '\000');
insert into ku values(2, '\040');
insert into ku values(3, ichar(0));
insert into ku values(4, ichar(32));

select n_pp, ascii(col) from ku ;
 n_pp | ascii
------+-------
    1 |    32
    2 |    32
    3 |     0
    4 |    32
(4 rows)

Look at the strings where "n_pp" equal 1 and 2. "Col" column always equals to 32
(decimal), but I inserted as '\000' and '\040'. (It is first way).
  In second way, If I use ichar() function, then "col" column has another
values. This result is correct (I think).
Is it right ?
  Locales for "postgres" user adjust properly (if it's necessary).

ps. I use some function from list, which generated by "\df" command from psql
console. But I didn't found them in pgsql documentation. Is it possible that
this function will be removed in future version of postgresql ?
pps. Can I take description of this function ?
  sorry for my bad english ;)


  Regards..
--

Re: insert char(1) type by different ways.

From
Tom Lane
Date:
"And. Andruikhanov" <andy@euinf.dp.ua> writes:
> insert into ku values(1, '\000');

This cannot work as you expect, because what comes out of the parser is
a string containing a single null character --- and that's fed to a
datatype input routine that expects a null-terminated string.  So the
char(n) input routine thinks you entered just '', which it blank-pads
to one character.

In general the Postgres I/O routines are not friendly to embedded nulls.
The char/varchar/text types could not support embedded nulls even
without the I/O problem, because they depend on C library routines like
strcoll(), and those routines don't support strings with embedded nulls.

            regards, tom lane

Re: insert char(1) type by different ways.

From
Karel Zak
Date:
On Sat, 3 Feb 2001, Tom Lane wrote:

> "And. Andruikhanov" <andy@euinf.dp.ua> writes:
> > insert into ku values(1, '\000');
>
> This cannot work as you expect, because what comes out of the parser is
> a string containing a single null character --- and that's fed to a
> datatype input routine that expects a null-terminated string.  So the
> char(n) input routine thinks you entered just '', which it blank-pads
> to one character.
>
> In general the Postgres I/O routines are not friendly to embedded nulls.
> The char/varchar/text types could not support embedded nulls even
> without the I/O problem, because they depend on C library routines like
> strcoll(), and those routines don't support strings with embedded nulls.

 And how store \000 to DB to standard tuples without exotic LO?

 By the way, for example MySQL client lib has nice (simple) function
that make correction from "arbitrary-data" to string that is correct
for all MySQL FE/BE routines (function convert problematic chars to \Oct
format). It's good feature, because user not must yourself check all
strings and know how chars is right for used DB.

 x1 = "Boys don't cry";

 mysql_escape_string(x2, x1, strlen(x1));

 ... and x2 is "Boys don\'t cry"

 (I not sure if quote is good example, but for others problematic chars
is good tool.)

        Karel