Bạn có thể ví dụ kiểm tra warning_count
biến:
MySQL [test]> SELECT CAST(0 AS UNSIGNED INTEGER) AS 'CAST1', @@warning_count;
+-------+-----------------+
| CAST1 | @@warning_count |
+-------+-----------------+
| 0 | 0 |
+-------+-----------------+
1 row in set (0.01 sec)
MySQL [test]> SELECT CAST('Banana' AS UNSIGNED INTEGER) AS 'CAST1', @@warning_count;
+-------+-----------------+
| CAST1 | @@warning_count |
+-------+-----------------+
| 0 | 1 |
+-------+-----------------+
1 row in set, 1 warning (0.00 sec)
Có một caveate mặc dù: số lượng cảnh báo chỉ được thiết lập lại mỗi tuyên bố, không cho mỗi hàng kết quả, vì vậy nếu CAST() được thực hiện mutiple lần, ví dụ cho mỗi hàng kết quả, bộ đếm sẽ tăng lên trên mỗi lần gọi không thành công.
Ngoài ra cảnh báo dường như không được thiết lập lại trên các truy vấn thành công mà không chạm vào bất kỳ bảng, như vậy trong ví dụ trên một 2nd
SELECT CAST(0 AS UNSIGNED INTEGER) AS 'CAST1', @@warning_count;
vẫn sẽ hiển thị 1 cảnh báo, trong khi ví dụ
SELECT CAST(0 AS UNSIGNED INTEGER) AS 'CAST1', @@warning_count
FROM mysql.user LIMIT 1;
một cách chính xác sẽ thiết lập lại nó để 0 ...
Nguồn
2014-12-06 14:05:54
phức tạp của nó ... Ý tôi là, tôi sử dụng để làm việc với MS SQL và cố gắng truyền 'Chuối' đến INT sẽ làm tăng một lỗi và truy vấn sẽ kết thúc. Ở đây, truy vấn sẽ tiếp tục với 0 và ở cuối, kết quả sẽ được trả về ngay cả khi cast không được làm việc. – Raphael
@Raphael. . . Bạn sẽ làm một cái gì đó tương tự trong SQL Server để ngăn chặn một lỗi. Điều này được gọi là "chuyển đổi im lặng", bởi vì nó không trả về lỗi, và đôi khi khá thuận tiện (mặc dù tôi thường làm điều đó chỉ bằng '+ 0'). –