SQLSRV连接MSSQL时阿拉伯文NVARCHAR字段显示异常问题
解决SQLSRV连接MSSQL输出NVARCHAR阿拉伯文的编码问题
问题分析
核心问题分为两点:
- 初始输出问号是因为数据库连接未指定正确字符集,导致阿拉伯文数据转码失败;
- 添加
"CharacterSet" => "UTF-8"后出现\u0635\u0646\u0641这类转义字符,是json_encode的默认行为——它会将非ASCII字符转为Unicode转义序列;手动解码后变回问号,大概率是解码逻辑错误或输出环节的字符集冲突。
解决方案
调整json_encode参数和代码逻辑即可解决:
- 使用
JSON_UNESCAPED_UNICODE参数让json_encode直接输出UTF-8编码的阿拉伯文,避免转义; - 统一收集查询结果后再输出JSON,避免生成多个独立的JSON片段(不符合标准JSON格式);
- 保留已设置的正确字符集配置和响应头。
修正后的代码
$connectionInfo = array( "Database"=>"VarrOne_DataBAse", "TrustServerCertificate"=>true, "CharacterSet" => "UTF-8" ); $conn = sqlsrv_connect( $serverName, $connectionInfo); if( $conn ) { $sql = "SELECT ProductName FROM ItemData"; $stmt = sqlsrv_query( $conn, $sql); if( $stmt === false ) { die( print_r( sqlsrv_errors(), true)); } // 统一收集所有结果 $results = []; while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC) ) { $results[] = $row['ProductName']; } // 设置响应头并输出标准JSON header("Content-Type: application/json; charset=utf-8"); echo json_encode($results, JSON_UNESCAPED_UNICODE); sqlsrv_free_stmt( $stmt); }
额外验证点
- 确认数据库中
ProductName字段的阿拉伯文数据存储正常(可通过SSMS直接查看); - 确保Apache和PHP默认字符集已设为UTF-8(php.ini中
default_charset = "UTF-8",Apache配置中AddDefaultCharset UTF-8),避免输出环节二次转码。
内容的提问来源于stack exchange,提问作者zyngot
相关产品推荐
相关产品推荐

