Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

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

Như chúng ta biết, MySQL sẽ sinh lỗi nếu tràn số xảy ra trong đánh giá biểu thức số. Ví dụ, BIGINT signed lớn nhất là 9223372036854775807, nên biểu thức sau sẽ sinh lỗi:

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

MySQL có thể xử lý loại tràn số này theo các cách sau:

BẰNG CÁCH CHUYỂN GIÁ TRỊ SANG UNSIGNED

MySQL cho phép loại phép toán này bằng cách chuyển giá trị sang unsigned 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 EXACT-VALUE ARITHMETIC

MySQL có thể dùng exact-value arithmetic để xử lý biểu thức trước. Vì tràn số xảy ra phụ thuộc vào phạm vi toán hạng. Ví dụ, phép tính trên có thể làm bằng giá trị DECIMAL như sau:

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