通过 ODBC MariaDB 连接器使用 ADO,我似乎无法正确返回小数



我最近从MySQL迁移到MariaDB,我的价格差了两个小数点。我做了一个检查,price列的类型设置为decimal(19,4),这样如果需要的话,我可以有4个小数点的精度。

  • 使用select语句登录MariaDB,价格正常。
  • 用heidisql登录也显示价格还可以。
  • 查看使用相同ODBC连接的链接表,我试图使用也是正确的。

所以我得出结论,通过ADO和ODBC连接器连接是有问题的。

我看了一下,我发现如果我把我的sql语句转换为十进制(6,2),那么小数就会正确显示,所以我直接在mariadb中重铸表。

然而,我注意到所有的价格都正确显示,除了小数点后有两个零的那个。

值是5.00,返回值是0.05

我不确定我哪里出错了,但这意味着任何整数或零都不会保留它们的位置。如何解决这个问题?是我的列的转换方式,还是vba:ado解释它接收到的内容的方式,还是odbc连接器返回的内容?

这是我正在使用的代码,以便尝试调试这个问题:

Public Sub decimalcheck()
  Dim db As New ADODB.Connection
  Dim rs As New ADODB.Recordset
  Dim constring As String
  constring = "DSN=my_dsn;"
  db.Open constring, "user", "pass"
  rs.ActiveConnection = db
  rs.Source = "select Prices FROM my_table "
  rs.Source = "select cast(my_prices as decimal(6,2) ) FROM my_table"
  rs.Open
  rs.MoveFirst
  Do While Not rs.EOF And Not rs.BOF
    Debug.Print rs.Fields(0)
    Debug.Print CDec(rs.Fields(0))
    rs.MoveNext
  Loop
  rs.Close
end sub

更新

我有一些结果将其转换为双精度,所以我不需要研究是否值得将其保留为小数或双精度

好的,这是我的结果:

所以我的假设是ado,(或vba)更习惯于使用double,并不能真正正确地解释十进制。这就给留下了一个问题:

Decimal和Double的区别是什么?
    我没找到什么。数字的大小是有区别的,但如果你要提供一个极限,比如小数(19,4)或双精度(19,4),那么这无关紧要,除非你超出了这两个范围中的一个,那么你就会被另一个困住,或者找到一个不同的解。所以对我来说这没什么大不了的。似乎人们都在说小数比双数更精确。我不确定这是什么意思,我猜是科学精度。我在和钱打交道,所以在我的例子中,我可能会满足于十进制,尽管它可能不是必需的,而且可能有点夸张。(参见Vladislav Vaintroub注释,如果小数在M,D范围内,它是绝对精确的。因此用它来表示金钱。)

我看到两个解决方案,但可能有很多

  1. 首先,你可以把小数改为双位数,然后保持不变。
  2. 第二,您将列保持为小数,然后在选择语句中将其与ADO一起使用时将其转换为双精度。示例代码:

    SELECT CAST(column_name AS DOUBLE(19,4)) FROM my_table

很抱歉问了一个问题,几分钟后才弄明白。希望它能帮助别人,如果没有的话…我们把它删掉。

最新更新