我最近一直在解决有关区域设置和小数分隔符的第三方应用程序的一些问题。这些问题的细节并不太相关,只是说应用程序是一个 Web 服务,读取数据类型为 money 的 SQL Server 列,并且它似乎乘以该值,因为小数分隔符被解释为千分隔器。
这让我想到了一个问题:在我的调查过程中,我注意到如果我打开 SSMS 并执行以下命令,我会返回“1,00”:
declare @money money;
set @money = 1;
select @money;
但是,如果我对同一台服务器执行以下操作,则会返回“1.00”:
declare @decimal decimal(18,2);
set @decimal = 1;
select @decimal;
我这里的 Windows 区域设置配置为使用逗号作为小数分隔符,因此从表面上看,货币值正确显示,而小数点则不正确。
这里发生了什么?目前尚不清楚为什么这两种数据类型的行为不同。这是由于 SQL Server 还是由 .Net 框架引起的?(该应用程序使用 .Net 框架,并且大概 SSMS 以相同的方式这样做......)
我发现以下票证似乎涉及相同的问题,但似乎没有提供答案:https ://connect.microsoft.com/SQLServer/feedback/details/636074/some-datatypes-doesnt-honor-localization
System.Data.Types 中 SqlDecimal 类型中的 ToString() 实现包含此作为算法的最后一步:
注意有一个硬编码的“。” 在那里?SqlMoney 没有这个,因为它调用了使用当前文化信息的特定格式。