2014-12-06 16 views
6

Ai đó có thể cho tôi biết làm thế nào tôi có thể phát hiện nếu một diễn viên thất bại trong MySQL sử dụng chức năng CAST()?Làm thế nào để biết CAST thất bại trong MySQL

Hai dòng này trả về giá trị như nhau: 0.

SELECT CAST('Banana' AS UNSIGNED INTEGER) AS 'CAST1'; 
SELECT CAST('0' AS UNSIGNED INTEGER) AS 'CAST2'; 

Trả lời

1

Bạn có thể sử dụng biểu thức thông thường để xác nhận các dữ liệu trước khi chuyển đổi:

select (case when val regexp '^[0-9]+$' then cast(val as unsigned integer) end) 
+0

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

+0

@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'). –

1

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 ...

2

Các SHOW WARNINGS tuyên bố và biến hệ thống @@WARNINGS được xây dựng trong các phương pháp để làm điều này. Không có cơ chế để tự động nâng cấp tất cả các cảnh báo lỗi, nhưng có một số điều bạn có thể làm.

Bạn có thể muốn bắt đầu MySQL với --show-warnings option, mặc dù điều đó có thể chỉ hiển thị số lượng cảnh báo với số lượng hàng. Tôi không nhớ được nữa. Tôi không biết nếu có một tùy chọn my.ini cho tùy chọn này. Ngoài ra còn có tùy chọn --log-warnings, mà tôi tin rằng không có tùy chọn trong tệp ini/cnf. Nếu bạn đang thực thi tập lệnh hoặc sử dụng CLI, lệnh \W sẽ hiển thị cảnh báo và \w sẽ tắt chúng cho (IIRC) kết nối hiện tại.

Bạn cũng có thể muốn xem SQL mode. TRADITIONAL có lẽ là giống như một RDBMS bình thường, nhưng nó là một loại chuột của các tùy chọn. Các chế độ STRICT là những gì bạn có nhiều khả năng nhất, nhưng hãy đọc qua trang đó. Hầu hết các ứng dụng được xây dựng trên MySQL tận dụng lợi thế của (không xác định) GROUP BY extensions mà chỉ cần mọi người di chuyển đến hoặc rời khỏi MySQL và TRADITIONAL cho phép ONLY_FULL_GROUP_BY, có hiệu quả vô hiệu hóa các tiện ích đó và RDBMS không hỗ trợ mệnh đề OVER(). Tôi không biết nếu âm thầm thành công tại typecasting sẽ hủy bỏ một giao dịch ngay cả trong chế độ truyền thống/nghiêm ngặt, tuy nhiên.

MySQL là loại trường mỏ của các loại vấn đề này (ví dụ: 0 ngày) do đó loại này có danh tiếng kém với DBA, đặc biệt là những người đã làm việc với v3.x hoặc v4.x.

Các vấn đề liên quan