Skip to content
New issue

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

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

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
Closed

detectTypes pro typ decimal vrací string #67

soukicz opened this issue Jun 21, 2012 · 5 comments

Comments

@soukicz
Copy link
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

@milo
Copy link
Collaborator

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?

@soukicz
Copy link
Contributor Author

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í.

@milo
Copy link
Collaborator

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.

@soukicz
Copy link
Contributor Author

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í.

@milo
Copy link
Collaborator

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants