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

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

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

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

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

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

2

Решение

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

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

От Руководство по PHP

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

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

От windows.php.net

0

Другие решения

Кажется, что 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"}
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector