You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP-ODBC连接MS-SQL时API返回小数为字符串的跨平台问题

问题解决方法

1. 手动转换字段类型与空值

针对出现差异的字段,在获取数据库查询结果后直接处理:

  • 对于MSK_Version,强制转为浮点型:
    $apiResult['MSK_Version'] = floatval($dbRow['MSK_Version']);
    
  • 对于Kill_System,将空字符串替换为null:
    $apiResult['Kill_System'] = $dbRow['Kill_System'] === '' ? null : $dbRow['Kill_System'];
    

2. 通过SQL查询直接转换类型

在查询语句里对字段做类型转换,让ODBC返回预期类型:

SELECT CAST(MSK_Version AS DECIMAL(5,2)) AS MSK_Version, 
       CASE WHEN Kill_System = '' THEN NULL ELSE Kill_System END AS Kill_System
FROM your_table;

3. 调整ODBC驱动配置

修改Linux下的ODBC配置文件(/etc/odbc.ini或用户目录下的~/.odbc.ini),添加参数强制驱动的类型映射:

[YourDatabaseDSN]
Driver = ODBC Driver 17 for SQL Server
Server = your_server_address
Database = your_database_name
# 让数值类型以浮点型返回
NumericAsFloat = Yes
# 禁止将null转为空字符串
NullsAsEmptyStrings = No

修改后重启Apache服务生效:sudo systemctl restart apache2

4. 全局结果标准化处理

如果有大量字段需要统一处理,写一个通用函数遍历API返回结果,自动转换:

function standardizeApiResponse($data) {
    if (!is_array($data)) {
        return $data;
    }
    foreach ($data as &$item) {
        $item = standardizeApiResponse($item);
        // 字符串转数值
        if (is_string($item) && is_numeric($item)) {
            $item = str_contains($item, '.') ? floatval($item) : intval($item);
        }
        // 空字符串转null
        elseif ($item === '') {
            $item = null;
        }
    }
    return $data;
}

在API返回前调用这个函数:echo json_encode(standardizeApiResponse($result));

内容的提问来源于stack exchange,提问作者Andre

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 04:00:13