Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

Already on GitHub? Sign in to your account

detectTypes pro typ decimal vrací string #67

Closed
soukicz opened this Issue Jun 21, 2012 · 5 comments

Comments

Projects
None yet
2 participants
Contributor

soukicz commented Jun 21, 2012

Pokud je sloupec typu decimal (8,3) a z databáze se čte celé číslo, mysql vrátí třeba "123.000". V dibi se detekuje jako decimal, takže se použije float. Na řádku 516 v DibiResult (metoda normalize) se ale provádí ještě jedna kontrola:

$row[$key] = (string) ($tmp = (float) $value) === $value ? $tmp : $value;

Pokud se pak vypisuje a ve sloupci decimal mám v jednom řádku hodnotu "123.001" a v druhém "123.000", tak první se převede správně na float, ale druhý se vrátí jako string.

Testováno na MySQL se stable dibi 2.0.1

Contributor

milo commented Jun 22, 2012

To je kontrola proti zaokrouhlování v PHP, aby se předešlo ztrátě desetinných míst. S celými čísly to nefunguje moc pěkně, vadí Ti to v něčem?

Contributor

soukicz commented Jun 22, 2012

Trápí mě to při výpisu do tabulky. Většinu hodnot mám celočíselných a některé s desetinným. Aby se zobrazily všechny stejně, musím to přetypovat na float. To není až takový problém, ale pokud je zapnutá autodetekce, tak bych očekával, že už to float bude.

Konkrétně u decimalu by se ztrátou desetinných míst ale neměl být problém, protože má stejně fixní počet, takže tam ta kontrola asi nebude potřeba. Úplně nejlepší by tedy bylo doplnit tam podmínku přímo na celočíselný decimal, protože jinde problém nebude. Asi by to vyřešilo toto:

$row[$key] = (string) ($tmp = (float) $value) === rtrim(rtrim($value,"0"),".") ? $tmp : $value;

Oříznou se koncové nuly (a případná tečka) a až následně se porovnává. Nevím ale, jaký vliv to bude mít na zmíněné zaokrouhlování.

Contributor

milo commented Jun 24, 2012

Říkám si, jestli nenechat detekovaná desetinná čísla vždy jako string. Nekonzistence vráceného typu může člověka překvapit. A kdyby někdo chtěl, natvrdo by mohl uvést setType('col', dibi::FLOAT). Případně do configu zavést něco jako convertFloats = TRUE.

Contributor

soukicz commented Jun 24, 2012

Teď se float převede na string pouze pokud tím zachrání desetinná místa. To mi přijde ještě rozumné. V tomhle případě ale naráží na nuly na konci, takže nic nezachraňuje. Takže bych buď trimoval nuly a nebo zpracování decimalů řešil samostatně, protože tam se desetinná místa neztrácí.

Contributor

milo commented Jun 24, 2012

Chápu problém i jak ho opravit. Ale když bude desetinných míst hodně a PHP zaokrouhlí, dibi vrátí jednou string, jednou float. Proto jsem pro bezpečný string, programátor obeznámený s float implementací na PHP si může chování vynutit.

@dg dg closed this in 2c9cbe9 Apr 3, 2013

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment