Mysql
MySQL 不正確的等式將 bigint 轉換為 char
為什麼以下語句在 MySQL 中是正確的?
CAST(544553000004545482 AS CHAR) = 544553000004545446
- 背景 -
我正在查詢一個使用者 ID 儲存為 的數據庫
VARCHAR(255)
,但我的程序將這些 ID 表示為整數,因此每當我有 WHERE 條件(例如WHERE userId = %s
. 我最近注意到上面的錯誤結果,因為在查詢以 5446 結尾的使用者時,我得到了以 5482 結尾的使用者的數據。我知道這裡的解決方案是將數據庫轉換為 BIGINT 列,或者在查詢之前將我的程序轉換為字元串,但我想了解為什麼上述情況是正確的?我猜這與一點精度錯誤有關。我注意到從 544553000004545441 - 544553000004545503 (包括,因此範圍為 63)寄存器中的任何值都是相等的,所以如果 SQL 將某處轉換為比 BIGINT 的 2**64 更低的位 int 可以解釋截斷。
我在自己的腳上開槍,為什麼會痛?
這是設計使然:
在所有其他情況下,參數將作為浮點(雙精度)數字進行比較。例如,字元串和數字操作數的比較是作為浮點數的比較進行的。
給定指數值,您正在達到雙精度浮點數表示值的限制。