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

2022-08-30 17:53:32

以下是相关代码:

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

结果应包含一个名为“该列”(当我执行“我可以验证”时)被截断为仅 15 个字符。最后一个字母被截断。MEASUREMENT_UNITprint_rMEASUREMENT_UNIT

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

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

我在这里看到了其他类似的帖子,但它们似乎都表明我应该能够获得至少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 安装的同一服务器上的同一文件中进行测试的。


答案 1

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


答案 2

问题肯定出在 Microsoft ODBC 驱动程序版本 11 上,并在 ODBC 驱动程序 13 预览版中修复了 SQL Server

我发现这是我运行ubuntu 14.04并安装了驱动程序13预览版的开发计算机工作正常,但是当我部署到使用驱动程序11运行RHEL 7的生产服务器时,各种破坏随之而来,因为列名被截断为15个字符。

微软的文档在Linux支持方面乏善可陈,所以如果你运行的是ubuntu,那么这就是安装它的要点


推荐