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

时间:2012-12-12 21:46:25

标签: php sql-server sql-server-2008-r2 odbc

以下是相关代码:

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) ) 

结果应该包含一个名为MEASUREMENT_UNIT的列,当我执行print_r我可以验证时)被截断为MEASUREMENT_UNI,只有15个字符。最后一个字母T被截断。

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

我还尝试过一个select,它指定字段名称,如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) )

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

3 个答案:

答案 0 :(得分:14)

显然问题出在ODBC上。在PHP中有一个错误,其中列名被截断为31个字符,解决这个问题的唯一方法是重新编译PHP,在name中更改/ext/odbc/php_odbc_includes.h的数组长度(通常为32,但显然是16你的情况),但事实证明这不安全或不安全。转到herehere以查看有关此内容的更多信息。

答案 1 :(得分:1)

永久解决方案是按PHP错误线程中的建议重新编译PHP,或尝试更新到更新的PHP版本。

您可以通过有选择地将select中的列重命名为较短的列来解决此问题:

$sql = "SELECT measurement_unit AS measure_unit, * FROM measurements WHERE ID=$id";
// now in your array you will have new index called "measure_unit"

答案 2 :(得分:1)

问题肯定出在Microsoft ODBC驱动程序版本11上,并在ODBC Driver 13 Preview for SQL Server中修复。

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

Microsoft的文档对于Linux支持来说是乏善可陈的,所以如果您正在运行ubuntu,那么这里安装它的gist