Sziasztok,
MySQL doksiból az jön le nekem, hogy v5.5.5-től kezdve tud hibát dobni a db integer túlcsordulásnál:
"As of MySQL 5.5.5, overflow during numeric expression evaluation results in an error. For example, the largest signed BIGINT value is 9223372036854775807, so the following expression produces an error:
mysql> SELECT 9223372036854775807 + 1;
ERROR 1690 (22003): BIGINT value is out of range in '(9223372036854775807 + 1)'"
Viszont nálam 5.1.x van, és BIGINT-nél ez a kifejezés:
select cast(9223372036854775807 + 1 as signed);
Ezt adja:
-9223372036854775808
Vagyis túlcsordul mindenféle kivétel és hibaüzenet nélkül. Jól sejtem hogy ez 5.1.x-en semmilyen trükkel nem lekezelhető?
Előre is köszi!
- 4959 megtekintés
Hozzászólások
Létezhet esetleg belső mód vagy kapcsoló amivel lehetne warning-ot generálni integer túlcsordulásnál vajon?
- A hozzászóláshoz be kell jelentkezni
SELECT @eredmeny = mezo2 + 1 FROM t1 LIMIT 1;
IF (@eredmeny <= mezo2)
ROLLBACK;
ENDIF;
Komolyra fordítva: mivel most már van, ez azt jelenti, hogy eddig nem volt. Sajnos.
- A hozzászóláshoz be kell jelentkezni
Nekem is ez a sejtésem.
A kódod sajnos nem jó, én is így akartam megoldani, de ugye olyan is előfordulhat, hogy nagy számmal szorzok, ekkor lehet hogy a bemenet kisebb volt, de mivel többször túlcsordul, ezért a végeredmény megjósolhatatlan, vagy kisebb - vagy nagyobb - össze vissza.
- A hozzászóláshoz be kell jelentkezni
mint minden workaround, ez sem tökéletes, sőt, újabb bugokat hoz be :-)
- A hozzászóláshoz be kell jelentkezni
nagy számok szorzása előtt a logaritmusukat megvizsgálni / összeadni?
így elkerülheted a veszélyesen nagy számok szorzását
gondolom erre jó lenne valami frappáns tárolt eljárást írni
- A hozzászóláshoz be kell jelentkezni
Ezt meg azért nem szeretném nagyon, mert az adott programrész nagyon sokszor meghívódik, és jelentős teljesítményt veszítenék. Tehát a komplex numerikus kifejezést nem akarom szétboncolni.
Bár lehet lebegőpontosként kellene megnéznem az eredményét, és úgy dönteni.
- A hozzászóláshoz be kell jelentkezni