以下是相关代码:

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时)将被截断为仅15个字符的MEASUREMENT_UNI。最后一个字母T被截断。

我还尝试对SQL Server数据库中的其他表和其他列进行查询,以确保没有与我正在使用的特定表或列有任何奇怪的设置的测试。我验证了相同的情况发生在不同的表/列中:如上所述,当我运行选择查询时,列名被截断为最多15个字符。

我还尝试了一个select方法,该方法指定了像select MEASUREMENT_UNIT from from measurements where ID=$id而不是select *这样的字段名,但这也不能解决问题。

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

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

编辑:连接到MySQL服务器数据库似乎没有导致相同的问题。 MySQL表中的数据库列名称未被截断,这使我相信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安装的同一服务器上的同一文件中进行了测试。

最佳答案

该问题肯定是与Microsoft ODBC驱动程序版本11并已在ODBC Driver 13 Preview for SQL Server中修复的。

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

微软的文档对Linux的支持乏善可陈,因此,如果您运行的是ubuntu,则这是安装它的gist

关于php - PHP&SQL Server-字段名被截断,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13849236/

10-09 17:56