V postgreSQL je možné do jedné buňkky uložit pole integerů (řetězců, dat, atd…) nette database ale vrací jen
- zac24
- Člen | 41
V postgreSQL je možné do jedné buňkky uložit pole integerů (řetězců, dat, atd…) nette database ale vrací jen retezec ve kterem je toto pole zakodovano stylem „{1,2,3,4,5}“ místo aby podle očekávání vrátilo skutečné php pole eventuálně objekt arrayhash. Nenapadá vás prosím jak toho chování docílit, protože jinak je práce s těmito typy buňek dost nepřehledná a je třeba si dopisovat matody na jejich transformaci z/do pole. Možná jen něco přehlížím.
- CZechBoY
- Člen | 3608
Ono to je trochu složitější asi.
Když budu vybírat konkrétní hodnotu, třeba sloupec[0]
tak by
se to mělo otypovat jako integer.
Když budu mít pole polí integerů a vyberu sloupecInt[0]
tak by
se to zase mělo otypovat jako pole a rozparsovat v php.
Je vůbec v NDT možný mít „název“ sloupce obsahující hranatý závorky? Potom by se samozřejmě dalo zjistit jakej typ to nakonec má mít.
Jinak pokud by sis to chtěl doplnit/poslat PR tak bude potřeba ještě změnit (minimálně) ResultSet::normalizeRow.
Editoval CZechBoY (22. 1. 2016 15:09)
- h4kuna
- Backer | 740
Ono je lehký zjistit typ. Protože ty typy co vrací postgres jsou prefixovaný podtržítkem a tím říká že je to pole. Int, float, datetime půjde v pohodě ale nejhorší bude string. A mít poloviční podporu asi nikdo nechce. A taky můžeš mít zanořený pole.
Editoval h4kuna (22. 1. 2016 20:10)
- CZechBoY
- Člen | 3608
Jo, ale když např selectnu pole[0] tak mi to žádnej typ nevrátí, ne?
Nebo mi něco uchází?
Dokážu si zjistit strukturu tabulky, ale asi ne co mi vrátí databáze jako
result set.
Jedině potom na základě počtu hranatých závorek v „názvu“ sloupce a
základního datovýho typu sloupce.
- h4kuna
- Backer | 740
Meta informace které jsou vytaženy při selectu.
array (6)
"pgsql:oid" => 1015
native_type => "_varchar" (8)
name => "list_string" (11)
len => -1
precision => -1
pdo_type => 2
Takže to „pgsql:oid“ definuje datový typ, což bude asi bitový pole a nějaký bit bude říkat že se jedná o pole. Nicméně „native_type“ pokud začíná podtržítkem tak je to pole.
To pole obsahující stringy může vypadat všelijak. Takže nejde použít explode, str_getcsv, nahradit kudrnatý závorky hranatými, udělat z toho php pole a prohnat eval, ani token_get_all si s tím neporadí a je potřeba napsat kolem toho víc.
Kdyby šlo donutit postgres, aby vždy vracel stringy v poli obalené do uvozovek, tak by to šlo už něčím prohnat. Jediný co jsem našel ze postgre 9.2+ umí převést svoje pole na json a z toho udělat přes json_decode objekt nebo php pole. Ale zase se musí myslet na to že to při selectu musíš obalit a to bude kámen úrazu.
Editoval h4kuna (23. 1. 2016 13:17)
- iguana007
- Člen | 970
A nebylo by možná lepší/jednodušší použít JSON type? http://www.postgresql.org/…pe-json.html