访问 ODBC:为数字(整数)字段返回了错误的值

Posted

技术标签:

【中文标题】访问 ODBC:为数字(整数)字段返回了错误的值【英文标题】:Access ODBC: Wrong value returned for numeric (integer) fields 【发布时间】:2015-03-27 14:11:14 【问题描述】:

我正在构建一个需要导入 Microsoft Access 文件的应用程序。该应用程序是用 php 编写的,并按照以下教程设置环境。 (https://gist.github.com/amirkdv/9672857)

下载了ODBC驱动libmdbodbc1,获取数值有问题。以为是驱动的问题,于是下载了Easysoft提供的试用驱动,没想到我也遇到了同样的问题。 (http://www.easysoft.com/products/data_access/odbc-access-driver/index.html#section=tab-1)

在我使用的文件中,我有以下结构:

当我在数据库中运行查询时,它会返回以下结果:

我通过 mb -tools 直接从命令行运行查询,因为起初我认为这可能是 PHP 的问题

我已经尝试了所有可以想象的事情,因为回溯了每一步,并且命令行和 PHP 都得到了相同的结果。已经在另一台机器上测试过了。

注意:我已经尝试查询其他文件并得到相同的错误,那么我认为问题不是文件。

注2:我解决了这个问题。返回值是双精度格式的值。可能驱动程序是用 C 语言编写的,这种方式是双倍的。通过使用带有 PHP 的 EasySoft 驱动程序,我得到了正确的表示。很快问题就出在 libmdbodbc1 驱动程序上。我将寻找 EasySoft 驱动程序的替代品,因为它非常昂贵。

【问题讨论】:

很明显,这些值除以 100。所以不要在某处隐藏某些百分比格式/处理导致您的值被视为百分比值,返回这些值的十进制等值? 【参考方案1】:

区号被检索为浮点值*,浮点数的默认格式(显然)是科学记数法,即

201 = 2.01 times 10 to the power of 2 --> 2.01000e+02

如果您的 ODBC 驱动程序(MDB 工具?)支持 CInt() 函数将值转换为整数,那么您可以使用

SELECT CInt(area_code) AS areacode ...

或者,如果这不起作用,您可以尝试使用CONVERT() ODBC 函数

SELECT  fn CONVERT(area_code, SQL_INTEGER)  AS areacode ...

否则,您可以在使用诸如intval() 之类的 PHP 函数检索该值后将其转换为整数。

* 发生这种情况的一种常见方式是将数值从 Excel 导入 Access。默认情况下,数值会以Double 的形式导入 Access,即使它们实际上只是 Excel 文档中的整数。

【讨论】:

以上是关于访问 ODBC:为数字(整数)字段返回了错误的值的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Oracle odbc 驱动程序没有为整数和数字类型提供 TYPE_NAME?

oracle odbc连接sqlserver 无法查询字段

where 子句中带有字符的整数字段返回奇怪的输出

645. 错误的集合

redis示例 - 限速器,计时器

错误的集合_leetcode