PHP7.4使用sqlsrv查询MS SQL Server遇特殊字符中断返回行问题
修复方案
你遇到的中断问题本质是sqlsrv扩展字符集配置和数据库存储编码不匹配,多字节特殊字符(如示例中的°)解析失败触发fetch逻辑终止,可按以下顺序排查修复:
- 第一步:数据库连接参数强制指定UTF-8编码,90%以上的同类问题都可以通过该配置解决
连接时新增CharacterSet参数,示例代码:
注意该参数值大小写敏感,必须写为$connectionInfo = array( "Database" => "你的数据库名", "UID" => "数据库账号", "PWD" => "数据库密码", "CharacterSet" => "UTF-8" ); $connms = sqlsrv_connect($serverName, $connectionInfo);UTF-8,不能写成utf8或者其他格式。 - 第二步:添加查询阶段错误检测,定位具体报错环节
分别在查询执行、fetch循环阶段增加错误打印逻辑,确认是查询执行报错还是读取阶段报错:// 查询执行后加错误检测 $getResults = sqlsrv_query($connms, $tsql); if ($getResults === false) { print_r(sqlsrv_errors(), true); exit; } // fetch循环内加错误检测 while ($row = sqlsrv_fetch_array($getResults, SQLSRV_FETCH_ASSOC)) { if ($row === false) { print_r(sqlsrv_errors(), true); exit; } // 原有业务逻辑 } - 第三步:调整数据库字段存储类型
确认description字段为nvarchar/ntext等支持Unicode的类型,若为普通varchar类型,非ASCII字符存储时就可能出现损坏,触发读取阶段异常。 - 第四步:临时兼容方案(不推荐长期使用)
如果无法修改数据库连接配置,可以在读取到字段后手动转码,根据数据库实际存储编码调整源编码参数即可:$description = mb_convert_encoding($row['description'], 'UTF-8', 'ISO-8859-1');
内容的提问来源于stack exchange,提问作者RickV
相关产品推荐
相关产品推荐

