Vừa qua, Ngô Tôn có gặp một trường hợp xảy ra khi thực hiện 1 câu truy vấn cơ sở dữ liệu MySQL khi thiết kế website với PHP với cột có kiểu Float.
Cụ thể, khi mình thực hiện đoạn lệnh sau đây thì gặp lỗi.
1 2 3 |
INSERT INTO my_table (my_float_column) VALUES (1.3); SELECT * from my_table where my_float_column = 1.3; >> no results found |
Rõ ràng câu lệnh SELECT là không sai, nhưng vẫn không ra kết quả. Sau một hồi kiểm tra dữ liệu mình phát hiện ra cột my_float_column có kiểu dữ liệu là Float. Vấn đề này có trên document của MySQL!
Theo như giải thích của MySQL thì, dữ liệu được lưu kiểu Float và Double mang giá trị gần đúng chứ không được lưu chính xác. Vì vậy, giá trị khi thêm từ câu truy vấn trên không bằng với giá trị được hiển thị.
Nếu bạn lưu giá trị 1.3 trong cột kiểu foat của cơ sở dữ liệu của bạn, MySQL thực chất sẽ lưu là 1.2999999523162842. Bạn có thế kiểm tra bằng câu lệnh SQL sau:
1 |
SELECT CAST(my_float_column AS DECIMAL(30, 16)) from my_table; |
Sai số này cũng phụ thuộc vào nền tảng hay quá trình thực thi dữ liệu.
Vì lý do này, tốt hơn và chính xác hơn nhiều nếu bạn có thể sử dụng kiểu dữ liệu Integer hoặc Decimal thay vì Float. Nếu bạn đang lưu trữ các giá trị tiền, bạn có thể lưu trữ các giá trị kiểu Integer hay Decimal.
Trong trường hợp bạn phải viết truy vấn đúng với kiểu Float thì đây là cách để bạn thực hiện điều này.
1 |
SELECT * FROM your_table WHERE cast(your_float as decimal(5,1)) = 1.3; |
Chúc các bạn thành công.
Leave a Reply