.net, l’infini et SQL Server
J’ai récemment eu besoin de représenter l’infini dans une base SQL Server. J’ai alors fait quelques recherches et j’ai découvert les constantes PositiveInfinity et NegativeInfinity au niveau des types Single et Double (respectivement float et double).
Ces constantes sont décrites par le standard IEEE 754 (Wikipedia). Il ne s’agit donc pas d’un concept propre à .net mais d’un concept propre à l’informatique en général.
J’ai testé plusieurs opérations avec l’infini, les règles mathématiques semblent respectées. Plusieurs choses sont cependant à noter :
- Il existe une constante NaN (Not a Number) qui correspond à un nombre qui ne représente pas un nombre.
- L’infini est égale à elle même
- NaN n’est pas égale à lui-même (comme en JavaScript)
J’ai alors essayé d’insérer ces constantes dans SQL Server, ADO.net déclenche une exception. Ces constantes ne sont pas définis au niveau de SQL Server !
J’ai cherché sur le net, et ce comportement est apparu à partir de SQL Server 2005, un bug connect a été créé à ce propos : Storing IEEE 754 Floats in SQL Server 2005 (NaN, +/- Infinity)
J’ai fait d’autres tests avec ces constantes. Si l’on sérialise cette valeur en SOAP, la valeur est bien transmise, la spécification SOAP définit les types float et double comme le décrit le standard IEEE 754. Si l’on sérialise en JSon via le JavaScriptSerializer, la valeur est bien transmise, JavaScript définit également ces constantes.
Si l’on souhaite vraiment stocker l’infini dans une base SQL Server, je vois alors plusieurs possibilités.
- soit on utilise une colonne de type binary(32) et on doit refaire tous les calculs ;
- soit on utilise une colonne XML et les performances seront dégradées ;
- soit on rajoute une colonne de type smallint et on traite les cas particuliers (number, NaN, NegativeInfinity, PositiveInfinity). Il s’agit de la solution que j’ai utilisé ;
- soit on utilise un UDT .net de type float ou double (merci à Christian pour l’astuce).
Et vous, avez-vous eu besoin de stocker l’infini dans une base de donnée ?