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.
3 answers
Проблема определенно связана с драйверами Microsoft ODBC версии 11 и исправлена в Драйвер ODBC 13 Предварительный просмотр для SQL Server.
Я обнаружил это, поскольку моя машина разработки под управлением ubuntu 14.04 с установленным предварительным просмотром драйвера 13 работает нормально, но затем, когда я развернулся на нашем производственном сервере под управлением RHEL 7 с драйвером 11, начались всевозможные беспорядки, поскольку имена столбцов были усечены на 15 символов.
Документация Microsoft является тусклой для поддержки Linux, итак, если вы используете ubuntu, то вот суть его установки.
По-видимому, проблема связана с ODBC. В PHP есть ошибка, при которой имена столбцов усекаются до 31 символа, и единственный способ исправить это - перекомпилировать PHP, изменив длину массива name
в /ext/odbc/php_odbc_includes.h
(обычно 32, но, по-видимому, в вашем случае это было 16), но это не доказано, является ли это безопасным или небезопасным. Перейдите сюда и сюда , чтобы увидеть дополнительную информацию об этом.
Постоянное решение состоит в том, чтобы перекомпилировать ваш 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"