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

标签 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 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 安装的同一服务器上的同一文件中测试的。

最佳答案

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

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

相关文章:

python - 无法让 Mercurial 的 hgweb.cgi 在 IIS7 上工作

sql - 查找 'break'记录

php - 在 MySQL 查询中使用函数

javascript - Ajax 和 MySql 插入、检查和检索

php - 使用 MySQL 命令提交 php 时出现内部服务器错误

c# - EF Core 3,优化大量Include/ThenInclude

sql - TSQL-重新排列代码中的sql作业步骤顺序

php - 防止重复下载相同的 CSS 文件

sql - 根据与小数点右侧匹配的值过滤数据的好方法是什么?

sql - 有没有办法计算列中 NULL 之间的非空数量?