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

Việc sử dụng chế độ SQL NO_UNSIGNED_SUBTRACT trong việc xử lý tràn là gì?

Trong trường hợp bật chế độ nghiêm ngặt SQL, phép trừ giữa các giá trị số nguyên trong đó một giá trị thuộc loại UNSIGNED sẽ tạo ra kết quả không có dấu theo mặc định. Nhưng MySQL tạo ra lỗi nếu kết quả là âm. Nó có thể được quan sát với ví dụ sau -

mysql> SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec)

mysql> Select CAST(0 AS UNSIGNED) -1;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'

Lỗi sau truy vấn ở trên cho thấy rằng đó là lỗi tràn sau biểu thức số học.

Bây giờ, nó có thể được xử lý với sự trợ giúp của việc bật chế độ SQL NO_UNSIGNED_SUBTRACTION. Sau khi bật chế độ này, kết quả sẽ là -1 thay vì lỗi.

mysql> Set sql_mode = 'NO_UNSIGNED_SUBTRACTION';
Query OK, 0 rows affected (0.00 sec)

mysql> Select CAST(0 AS UNSIGNED) -1;
+------------------------+
| CAST(0 AS UNSIGNED) -1 |
+------------------------+
|                     -1 |
+------------------------+
1 row in set (0.00 sec)