[megoldva]postgresql: mezőméret nem értem

csinálok egy teszt táblát, amiben van egy fix 9 karakter széles mező, ebbe szeretném belerakni az id mezőt balról 0-val feltöltve 9 szélesen.
mit rontok el?

chartestdb=> create table test(id serial, m char(9));
CREATE TABLE
chartestdb=> insert into test (id) values (nextval('test_id_seq'));
INSERT 0 1
chartestdb=> insert into test (id) values (nextval('test_id_seq'));
INSERT 0 1

chartestdb=> select * from test;
id | m
----+---
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
(10 rows)

chartestdb=> update test set m=to_char(id,'000000009');
ERROR: value too long for type character(9)
chartestdb=> update test set m='123456789';
UPDATE 10
chartestdb=>

Hozzászólások

A to_char() második paramétere egy decimális helyiértéket ír elő. Amikor az id=10, akkor nem konvertálható ilyen formába.


dts=# update test set m=to_char(id,'09999999');
UPDATE 10
dts=# select * from test;
 id |     m     
----+-----------
  1 |  00000001
  2 |  00000002
  3 |  00000003
  4 |  00000004
  5 |  00000005
  6 |  00000006
  7 |  00000007
  8 |  00000008
  9 |  00000009
 10 |  00000010
(10 rows)

dts=# 

A to_char visszatérési értéke text típusú, ami tartalmazza a termináló NULL karaktert is. Vegyél fel egy karakterrel hosszabb mezőt, vagy konvertáld a text típust char(9)-re.

ha hosszabb mezőt veszek és 9 karakterrel töltöm fel, akkor elérak egy szóközt.
az, hogy a text termináló null karakter lenne a végén, némiképp cáfolni látszik az, hogyha:
update test set m=substring(to_char(id,'099999999'),2,9);
ezt írom, akkor jó lesz az eredmény.
inkább saccolnám, hogy van előtte egy hossz byte...

de szerintem ez postgres bug, hiszen ha mindkét mező típusa ismert, tudnia kellene konvertálni.

"...ha hosszabb mezőt veszek és 9 karakterrel töltöm fel, akkor elérak egy szóközt..."
"...inkább saccolnám, hogy van előtte egy hossz byte..."


dts=# select id,to_char(id,'FM099999999') from test;
 id |  to_char  
----+-----------
  1 | 000000001
  2 | 000000002
  3 | 000000003
  4 | 000000004
  5 | 000000005
  6 | 000000006
  7 | 000000007
  8 | 000000008
  9 | 000000009
 10 | 000000010
(10 rows)

Inkább saccolnám, hogy van előtte egy space... 'FM099999999' a barátod!

további vicces vagy nem értem dolog:
insert into test (id) values (123456789);

update test set m=substring(to_char(id,'099999999'),2,9);
UPDATE 11

chartestdb=> select * from test;
id | m
-----------+-----------
1 | 000000001
2 | 000000002
3 | 000000003
4 | 000000004
5 | 000000005
6 | 000000006
7 | 000000007
8 | 000000008
9 | 000000009
10 | 000000010
123456789 | 123456789

Bzmg... számot, SZÁMOT karakteres mezőbe rak... Normáááális?

Nem nyert:


sgyori@hp6730s:~$ psql dts -U dts
psql (8.4.2)
Type "help" for help.

dts=# update test set m=LPAD(id, 9, '0');
ERROR:  function lpad(integer, integer, unknown) does not exist
LINE 1: update test set m=LPAD(id, 9, '0');
                          ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.