Re: Smallmoney and money rounded to 2 decimals?
Sebastien FLAESCH <[email protected]> Thu, 12 Apr 2018 10:37:43 +0200
| Newsgroups | gmane.comp.db.tds.freetds |
|---|---|
| Organization | Four Js Development Tools |
| Message-ID | <[email protected]> |
On 04/12/2018 09:41 AM, Frediano Ziglio wrote: > 2018-04-06 12:59 GMT+01:00 Sebastien FLAESCH <[email protected]>: >> Hi all, >> >> Using FreeTDS 1.00.9: >> >> When fetching a smallmoney or money data, SQLDescribeCol() returns >> the sqltype SQL_DECIMAL, precision 10 for smallmoney and or 19 for >> money and a scale of 4 for both types, which is fine, since smallmoney >> and money can store 4 decimal digits. >> >> Using an SQL_C_CHAR buffer to hold the values, we see that the decimal >> part is rounded to 2 digits... >> >> Is this expected? >> >> using other ODBC drivers for SQL Server we get 4 decimal digits. >> >> Is there some configuration settings to control this? >> >> Thanks! >> Seb > > Just checked. Yes, apparently Microsoft ODBC drivers format money with > 4 decimal digit. > I think in the past tools used 2 digits but they moved to 4 along the way. > There's actually no way to change that behavior but probably there should be. > The 2 digits code is currently quite hard coded in src/tds/convert.c > and src/tds/numeric.c. > I suppose a good way would be to add a flag to TDSCONTEXT (which is > used during conversion to pass locale information). > > Frediano > _______________________________________________ > FreeTDS mailing list > [email protected] > https://lists.ibiblio.org/mailman/listinfo/freetds > Hello Frediano, and thanks for considering this! I am not familiar with FreeTDS code internals and TDSCONTEXT. I you want to keep backward compatibility, I assume that there will be a new ODBC connection attribute to control that. http://www.freetds.org/userguide/odbcconnattr.htm And if we consider the current behavior as a bug, the default should be 4 decimal digits, and people expecting 2 will have to define the parameter. MoneyFormatDecDigits=2 You may also consider rounding issues: Currently FreeTDS rounds to 2 digits... What happens with a db value like 0.1160 ? To be fetched as 0.12, or as 0.11 ? When 0.11, is this data loss or ok? It's monetary data! I vote for a bug => return always 4 digits. Seb