PHP и SQL Server - имена полей усечены


Вот соответствующий код:

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 НЕ были усечены, что наводит меня на мысль, что это не проблема с плагином 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.

Author: nmc, 2012-12-13

3 answers

Проблема определенно связана с драйверами Microsoft ODBC версии 11 и исправлена в Драйвер ODBC 13 Предварительный просмотр для SQL Server.

Я обнаружил это, поскольку моя машина разработки под управлением ubuntu 14.04 с установленным предварительным просмотром драйвера 13 работает нормально, но затем, когда я развернулся на нашем производственном сервере под управлением RHEL 7 с драйвером 11, начались всевозможные беспорядки, поскольку имена столбцов были усечены на 15 символов.

Документация Microsoft является тусклой для поддержки Linux, итак, если вы используете ubuntu, то вот суть его установки.

 1
Author: Jeff Puckett, 2016-03-30 04:56:27

По-видимому, проблема связана с ODBC. В PHP есть ошибка, при которой имена столбцов усекаются до 31 символа, и единственный способ исправить это - перекомпилировать PHP, изменив длину массива name в /ext/odbc/php_odbc_includes.h (обычно 32, но, по-видимому, в вашем случае это было 16), но это не доказано, является ли это безопасным или небезопасным. Перейдите сюда и сюда , чтобы увидеть дополнительную информацию об этом.

 14
Author: Carlos Vergara, 2012-12-19 04:09:47

Постоянное решение состоит в том, чтобы перекомпилировать ваш PHP, как предложено в потоках ошибок PHP, или попробовать обновить его до более новой версии PHP.

Вы можете обойти проблему, выборочно переименовав столбцы в вашем выборе в более короткие:

$sql = "SELECT measurement_unit AS measure_unit, * FROM measurements WHERE ID=$id";
// now in your array you will have new index called "measure_unit"
 1
Author: Alex, 2012-12-20 15:07:37