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

