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
相关产品推荐
相关产品推荐

