2011-08-02 41 views
8

tuyên bố chèn của tôi trông như thế này:chuỗi rỗng chèn một số không, không một null

INSERT INTO foo (bar) VALUES (''); 

Trường bar đã được tạo ra như vậy:

bar INT(11) 
    COLLATION: (NULL) 
    NULL: YES 
    DEFAULT: (NULL) 

phiên bản MySQL: 5.1.

Không phải là chuỗi rỗng có chèn NULL không? Tôi không chắc tại sao tôi lại thấy số 0 (0) được lưu trữ trong bảng.

+0

xem thêm mysql "chế độ nghiêm ngặt" –

Trả lời

11

MySQL theo mặc định cố gắng ép buộc giá trị không hợp lệ cho cột thành loại chính xác. Ở đây, chuỗi rỗng '' có dạng chuỗi, không phải là số nguyên hay NULL. Tôi đề nghị thực hiện các bước sau:

  1. Thay đổi các truy vấn như sau: INSERT INTO foo (bar) VALUES (NULL);
  2. Enable chế độ nghiêm ngặt trong MySQL. Điều này ngăn không cho nhiều chuyển đổi giá trị và loại không mong muốn xuất hiện. Bạn sẽ thấy nhiều thông báo lỗi hơn khi bạn cố gắng làm điều gì đó mà MySQL không mong đợi, điều này giúp bạn phát hiện vấn đề nhanh hơn.
+0

# 2 giải thích rất nhiều. Cảm ơn bạn. – gravyface

+0

Chế độ nghiêm ngặt là rất quan trọng. Mysql mặc định nghiêng về phía dữ liệu cẩu thả. Là một nhà phát triển, bạn có thực sự muốn cắt bớt dữ liệu và không nhận thức được dữ liệu đó không? Ouch. –

5

Bạn không chèn NULL vào bảng; bạn đang chèn một chuỗi rỗng (mà dường như ánh xạ tới số không dưới dạng int). Hãy nhớ rằng NULL là một giá trị khác biệt trong SQL; NULL != ''. Bằng cách chỉ định bất kỳ giá trị nào (ngoài NULL), bạn không chèn NULL. Mặc định chỉ được sử dụng nếu bạn không chỉ định giá trị; trong ví dụ của bạn, bạn đã chỉ định một giá trị chuỗi cho một cột số nguyên.

+0

"có vẻ là ánh xạ bằng 0" và trạng thái trong sách hướng dẫn MySQL là "Đối với kiểu số, mặc định là 0" nhưng nếu được đặt thành NULL làm mặc định cho cột, tại sao nó đặt nó bằng 0? Cách tôi đọc như thế nào nó hoạt động là _anything_ nhưng một số nguyên nên được lưu trữ như NULL nếu mặc định được thiết lập để NULL. – gravyface

+3

Giá trị mặc định cho cột chỉ phù hợp nếu bạn không cung cấp giá trị. Ở đây bạn đã cung cấp một giá trị, nhưng nó không hợp lệ, vì vậy MySQL cố gắng diễn giải nó như một số nguyên. Cách giải thích nó đến là số nguyên 0. – Hammerite

2

Cách để làm điều này là không điền vào trường nào cả. chỉ điền vào những cái thực sự cần có giá trị.

2

Tại sao nó phải là NULL? Bạn đang cung cấp giá trị có đại diện số nguyên: chuỗi trống chuyển đổi thành INT0.

Chỉ khi bạn không cung cấp bất kỳ giá trị nào là giá trị mặc định sẽ tiếp quản.

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