Я пытаюсь выполнить запрос к первичному ключу BIGINT в базе данных MSSQL, и некоторые возвращаемые значения округляются, и они отличаются от значений, хранящихся в базе данных:
9200000000000359 существует в БД, а также 9200000000000361. Запрос любого из этих двух значений вернет 9200000000000360 (примечание: это значение не существует в базе данных).
Кажется, что значения сначала (ошибочно) преобразуются в двоичные, и при обратном преобразовании они приводят к значениям, отличным от исходных. Но я использую PHP 5.6 на 64-битной машине, а не 32-битной. Это также происходит при использовании драйверов dblib и odbc.
Есть ли какие-либо настройки, которые я могу сделать на SQLServer или в конфигурации php.ini, чтобы получить правильные значения?
Если вы используете PHP под Windows, вам следует перейти на PHP 7+.
64-битные платформы обычно имеют максимальное значение около 9E18, за исключением
Windows до PHP 7, где она всегда была 32-битной.
x86_64 сборки
X64-сборки PHP 5 для Windows являются экспериментальными и не обеспечивают поддержку 64-битных целых или больших файлов.PHP 7 обеспечивает полную 64-битную поддержку. X64-сборки PHP 7 поддерживают собственные 64-битные целые числа, LFS, memory_limit и многое другое.
Кажется, что 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"}