PHP和SQL Server - 字段名称被截断

nmc*_*nmc 23 php sql-server odbc sql-server-2008-r2

这是相关代码:

function connect(){
    // DB credentials and info defined here....
    $connection = odbc_connect("DRIVER={SQL Server Native Client 11.0}; Server=$server; Database=$db;", $loginname, $loginpass);
    return $connection;
}

function odbc_fetch_results($stmt, &$results) {
    $numrows = odbc_num_rows($stmt);
    $row = odbc_fetch_array($stmt);
    print_r($row); // Prints: Array ( [MEASUREMENT_UNI] => kg)
    if($row){
         $results = array ($row);
         while( $row = odbc_fetch_array($stmt)){
            array_push($results, $row);
         }
    }
    return $numrows;
}

$sql = "select * from measurements where ID=$id";
$stmt = executeSQL($conn,$sql);
$nrows = odbc_fetch_results($stmt, $results);
odbc_free_result($stmt);
print_r($result[0]); // Prints: Array ( [0] => Array ( [MEASUREMENT_UNI] => kg) ) 
Run Code Online (Sandbox Code Playgroud)

结果应该包含一个被称为列的列MEASUREMENT_UNIT(当我执行一个print_r我可以验证时)被截断到MEASUREMENT_UNI只有15个字符.最后一封信T被切断了.

我还尝试使用SQL Server数据库上的不同表和不同列的查询作为测试,以确保它与我正在使用的特定表或列没有任何奇怪的设置.我使用不同的表/列验证了同样的事情:当我运行上面的选择查询时,列名最多被截断为15个字符.

我也尝试了一个选择,它指定字段名称select MEASUREMENT_UNIT from from measurements where ID=$id而不是select *但不能解决问题.

我在这里看过其他类似的帖子,但它们似乎都表明我应该能够获得至少30个字符,而不是我看到的15个字符限制.

为什么列名被截断为15个字符?

编辑:连接到MySQL服务器数据库似乎没有导致相同的问题.MySQL表中的DB列名称没有被截断,这让我相信这不是ODBC插件的问题.

$connection = odbc_connect("DRIVER={MySQL};Server=$server; Database=$db;", $loginname, $loginpass);
$sql = "select * from measurements where ID=$id";
$stmt = executeSQL($conn,$sql);
$nrows = odbc_fetch_results($stmt, $results);
odbc_free_result($stmt);
print_r($result[0]); // Prints CORRECTLY: Array ( [0] => Array ( [MEASUREMENT_UNIT] => kg) )
Run Code Online (Sandbox Code Playgroud)

请注意,上述两个代码部分都在同一服务器上使用相同的PHP + ODBC安装在同一文件中进行了测试.

Car*_*ara 14

显然问题出在ODBC上.在PHP中有一个错误,其中列名被截断为31个字符,解决这个问题的唯一方法是重新编译PHP,更改namein 的数组长度/ext/odbc/php_odbc_includes.h(通常为32,但显然在你的情况下为16),但这并未证实安全或不安全.去这里这里看到更多这方面的信息.


Jef*_*ett 2

该问题肯定与 Microsoft ODBC 驱动程序版本 11 有关,并在ODBC Driver 13 Preview for SQL Server中得到修复。

我发现这是因为我的开发机器运行安装了 Driver 13 Preview 的 ubuntu 14.04 工作正常,但是当我部署到运行 RHEL 7 和 Driver 11 的生产服务器时,由于列名被截断为 15 个字符,各种破坏随之而来。

Microsoft 的文档对 Linux 支持乏善可陈,因此如果您运行的是 ubuntu,那么这里是安装它的要点。