2016-09-29 224 views
2

我想查詢針對MSSQL數據庫上BIGINT主鍵和一些返回的值調高圓潤,比存儲在數據庫中的有所不同:PDO MSSQL - 錯BIGINT返回值

See screenshot here

9200000000000359存在於DB以及9200000000000361中。查詢這兩個值中的任何一個都會返回9200000000000360(注意:該值在數據庫中不存在)。

看起來,這些值首先(錯誤地)轉換爲二進制,並在轉換回來時導致與原始值不同的值。但我在64位機器上使用PHP 5.6,而不是32位。當使用dblib和odbc驅動程序時也會發生這種情況。

有什麼設置可以在SQLServer或php.ini配置中獲得正確的值嗎?

+0

奇怪的是,什麼是'串(16)'? – 2016-09-29 07:46:29

+0

如果你在你的16位整數週圍加上單引號「'」,會發生什麼? – Abela

+0

@Abela我不認爲它可能會改變一件事情,因爲兩者都是字符串。編輯:順便說一句,是一個輸出字符串,你不能改變引號。 – 2016-09-29 07:47:30

回答

0

看來的Yii使得轉換浮動對結果。即使是在64位計算機上的純PHP 7返回以下輸出:

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

如果您在Windows下使用PHP,那麼您應該升級到PHP 7+。

64位平臺的最大值通常大約爲9E18,除了在PHP 7之前的 Windows之外,它總是32位。

PHP Manual

x86_64的構建 是x64構建PHP 5中爲Windows是實驗性的,並沒有提供64位整數或大文件支持。

PHP 7提供了完整的64位支持。 PHP 7的x64版本支持原生64位整數,LFS,memory_limit等等。

windows.php.net

+0

在本地macOS Sierra上的PHP 7.0.11和CentOS 64位服務器上的PHP 5.6.25(CentOS版本6.7/Linux 2.6.32-573.el6.x86_64)上都會出現此問題。 –