Computer >> Máy Tính >  >> Lập trình >> MySQL

MySQL xử lý tràn như thế nào trong quá trình đánh giá biểu thức số?

Như chúng ta biết rằng MySQL sẽ tạo ra lỗi nếu xảy ra tràn trong quá trình đánh giá các biểu thức số. Ví dụ:BIGNT có chữ ký lớn nhất là 9223372036854775807, do đó, biểu thức sau sẽ tạo ra lỗi -

mysql> Select 9223372036854775807 + 1;
ERROR 1690 (22003): BIGINT value is out of range in '(9223372036854775807+1)'

MySQL có thể xử lý các loại tràn như vậy theo những cách sau:

BẰNG CÁCH CHUYỂN ĐỔI GIÁ TRỊ THÀNH CHƯA ĐĂNG KÝ

MySQL cho phép các loại hoạt động như vậy bằng cách chuyển đổi các giá trị thành không dấu như sau -

mysql> Select CAST(9223372036854775807 AS UNSIGNED) +1;
+------------------------------------------+
| CAST(9223372036854775807 AS UNSIGNED) +1 |
+------------------------------------------+
|                      9223372036854775808 |
+------------------------------------------+
1 row in set (0.07 sec)

BẰNG CÁCH SỬ DỤNG THUẬT TOÁN CÓ GIÁ TRỊ CHÍNH XÁC

MySQL có thể sử dụng số học giá trị chính xác để xử lý biểu thức trước đó. Đó là bởi vì sự tràn xảy ra phụ thuộc vào phạm vi của các toán hạng. Ví dụ, phép tính trên có thể được thực hiện bằng cách sử dụng giá trị DECIMAL như sau -

mysql> Select 9223372036854775807.0 + 1;
+---------------------------+
| 9223372036854775807.0 + 1 |
+---------------------------+
|     9223372036854775808.0 |
+---------------------------+
1 row in set (0.01 sec)