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

迁移Hostinger MySQL后Flutter API数据类型不符问题排查与修复

MySQL迁移至Hostinger后API数据类型变化问题解析

一、数据类型变化的原因

  • PHP版本差异:旧服务器和Hostinger的PHP版本不同,比如PHP 8.x及以上版本默认会按照MySQL原生数据类型返回结果,而此前的PHP 7.x版本可能默认把所有数据库字段转成字符串返回。Hostinger服务器大概率采用了较新的PHP版本,直接导致ID从字符串变为整数。
  • 数据库驱动配置差异:如果API用PDO或mysqli连接数据库,旧服务器可能开启了强制字符串化结果的配置(比如PDO的PDO::ATTR_STRINGIFY_FETCHES),但Hostinger的默认配置未开启,所以返回的ID保留了MySQL的整数类型。
  • 迁移工具的细微差异:部分数据库迁移工具在导出导入数据时,对字段类型的处理可能存在小差别,但这种情况概率较低,核心原因还是PHP端的处理逻辑变化。

二、恢复原有行为的解决方法

1. 后端代码强制转换ID为字符串

在API返回JSON前,手动将ID字段转为字符串,这是最直接的修复方式:

// 示例:假设数据库查询结果存在$data数组中
foreach ($data as &$item) {
    $item['id'] = (string)$item['id'];
}
echo json_encode($data);

2. 配置数据库驱动强制返回字符串

如果用PDO连接数据库,初始化时添加以下配置,让所有查询结果都转为字符串:

$dsn = 'mysql:host=localhost;dbname=你的数据库名;charset=utf8mb4';
$pdo = new PDO($dsn, '用户名', '密码', [
    PDO::ATTR_STRINGIFY_FETCHES => true,
    PDO::ATTR_EMULATE_PREPARES => true
]);

如果用mysqli,可通过设置选项关闭原生整数/浮点数返回:

$mysqli = mysqli_init();
// 关闭原生类型返回,强制转字符串
mysqli_options($mysqli, MYSQLI_OPT_INT_AND_FLOAT_NATIVE, false);
mysqli_real_connect($mysqli, 'localhost', '用户名', '密码', '你的数据库名');

3. 前端Flutter代码适配(可选)

若不想改动后端,也可以在Flutter接收数据时把ID转为字符串:

// 示例:从API返回的JSON中提取ID
Map<String, dynamic> apiData = await fetchDataFromApi();
String id = apiData['id'].toString();

这种方法适合前端改动量小的场景,但如果涉及多处ID处理,修改后端会更高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 01:41:14