PDO MSSQL - возвращено неверное значение BIGINT

Я пытаюсь выполнить запрос к первичному ключу BIGINT в базе данных MSSQL, и некоторые из возвращаемых значений округляются, а не те, которые хранятся в базе данных:

Смотрите скриншот здесь

9200000000000359 существует в БД, а также 9200000000000361. Запрос к любому из этих двух значений вернет 9200000000000360 (примечание: это значение не существует в базе данных).

Кажется, что значения сначала (ошибочно) преобразуются в двоичные, и при обратном преобразовании они приводят к значениям, отличным от исходных. Но я использую PHP 5.6 на 64-битной машине, а не 32-битной. Также это происходит при использовании драйверов dblib и odbc.

Есть ли какие-либо настройки, которые я могу сделать на SQLServer или в конфигурации php.ini, чтобы получить правильные значения?

2 ответа

Решение

Кажется, что Yii делает преобразование, чтобы плавать на результат. Даже простой PHP 7 на 64-битной машине возвращает следующий вывод:

php > echo (int)(float)9200000000000359;
9200000000000360

Используя простой PHP и PDO, возвращается правильный вывод:

$db = new PDO($dbc->connectionString, $dbc->username, $dbc->password);
$stmt = $db->query("...... WHERE id = 9200000000000359");
var_dump($stmt->fetchAll(PDO::FETCH_ASSOC)[0]['id']);

// output:
array(1) {
    [0] => string(16) "9200000000000359"
}

Если вы используете PHP под Windows, вам следует перейти на PHP 7+.

Максимальное значение для 64-разрядных платформ обычно составляет около 9E18, за исключением Windows до PHP 7, где оно всегда было 32-разрядным.

Из руководства по PHP

Сборки x86_64 Сборки x 5 PHP 5 для Windows являются экспериментальными и не обеспечивают поддержку 64-битных целых или больших файлов.

PHP 7 обеспечивает полную 64-битную поддержку. X64-сборки PHP 7 поддерживают собственные 64-битные целые числа, LFS, memory_limit и многое другое.

Из http://windows.php.net/index.php

Другие вопросы по тегам