【问题标题】:sqlsrv_query stopping while encountering an errorsqlsrv_query 在遇到错误时停止
【发布时间】:2021-10-19 10:57:38
【问题描述】:

我正在尝试从我的 ms sql 数据库中获取数据。我在php中使用sqlsrv进行连接,一切正常,也许我的select似乎有问题,我认为它与char编码有关。

我的查询:

SELECT TOP 100 NOM FROM SITE WHERE SITE.DATFINVAL IS NULL

我的代码:

$msconn = msdbConnect();
$ms_query = "SELECT TOP 100 NOM FROM SITE WHERE SITE.DATFINVAL IS NULL;
ini_set('mssql.charset', 'UTF-8');
$stmt = sqlsrv_query($msconn, $ms_query);
if ($stmt === false) {
  die(print_r(sqlsrv_errors(), true));
}

while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
  echo $row['NOM'] . "<br />";
}

sqlsrv_free_stmt($stmt);

事实上,我的选择查询在从服务器本身执行时运行良好,但在 php 中使用 sqlsrv_query 执行时,它会在遇到第 6 行“PDA BRUZ - N° 80100”时停止。

结果应该显示 100 行“NOM”,但它只显示 5 行,这很奇怪,因为我使用的查询在 SQL Server 管理工具中运行良好。

我还尝试仅选择第 6 行“PDA BRUZ - N° 80100”,但它不适用于 php。所以我猜这是一个编码问题,可能是由于“°”,但我不知道如何解决这个问题,我已经尝试在 sqlsrv_query 语句之前粘贴这行代码:

ini_set('mssql.charset', 'UTF-8');

但它仍然不起作用,我已经习惯了 mysqli,而不是仅仅停止选择查询会显示数据但字符集不正确。我应该如何解决我的愚蠢错误?

提前致谢

【问题讨论】:

  • 我的错,我正在编辑我的问题以使其符合标准
  • “它停止”、“不起作用”和“遇到错误”究竟是什么意思?无论编码如何,查询本身都没有产生正确的结果集的原因。直接在 SSMS 查询窗口中运行时,该查询是否“工作”?如果是这样,那么问题出在您的应用程序中 - 您需要发布执行查询和处理结果集的相关代码。
  • 请原谅我的错误解释,我刚刚编辑了我的问题
  • 我不认为mssql.charset 指令与sqlsrv 扩展有任何关系。在 Microsoft 创建自己的之前,曾经有一个名为 mssql 的旧 SQL Server 扩展,现在似乎从文档中消失了。您能否为sqlsrv_fetch_array() 添加您已经为sqlsrv_query() 执行的相同错误检查?
  • 我刚刚添加了相同的错误检查,但对于 fetch_array 并且到目前为止没有任何报告。显示的结果仍然包含前 5 行而不是我要求的 100 行

标签: php sql-server encoding sqlsrv


【解决方案1】:

对于遇到这种情况的任何人,我通过编辑 SQL 查询找到了解决方案

SELECT TOP 10 NOM FROM SITE WHERE SITE.DATFINVAL IS NULL

SELECT TOP 10 CONVERT(nvarchar, NOM) FROM SITE WHERE SITE.DATFINVAL IS NULL

这绝对是编码的问题,所以我尝试将 varchar(30) 转换为 nvarchar(30),这似乎是使用 sqlsrv_fetch_array 检索数据的正确方法,如果遇到错误的特殊字符则不会停止。

【讨论】:

  • 您可以尝试通过在sqlsrv_connect() 中添加"CharacterSet" =&gt; "UTF-8" 作为附加选项来更改编码。默认optionSQLSRV_ENC_CHAR
  • 我尝试了您的解决方案,乍一看似乎有效!我仍然会保留我的 CONVERT 查询,但除了 CharacterSet => UTF-8
猜你喜欢
  • 1970-01-01
  • 2011-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多