Tôi đã từng sử dụng các câu lệnh mysql_connect(), mysql_query(), vv chuẩn để thực hiện các công cụ MySQL từ PHP. Gần đây tôi đã chuyển sang sử dụng lớp MDB2 tuyệt vời. Cùng với nó, tôi đang sử dụng các câu lệnh chuẩn bị, vì vậy tôi không phải lo lắng về việc thoát khỏi các cuộc tấn công đầu vào và SQL injection của mình.Chuỗi rỗng trong cột không rỗng trong MySQL?
Tuy nhiên, có một vấn đề mà tôi đang gặp phải. Tôi có một bảng với một vài cột VARCHAR, được chỉ định là không null (có nghĩa là, không cho phép các giá trị NULL). Sử dụng các lệnh MySQL PHP cũ, tôi có thể làm những việc như thế này mà không cần bất kỳ vấn đề:
INSERT INTO mytable SET somevarchar = '';
Bây giờ, tuy nhiên, nếu tôi có một truy vấn như:
INSERT INTO mytable SET somevarchar = ?;
Và sau đó trong PHP tôi có:
$value = "";
$prepared = $db->prepare($query, array('text'));
$result = $prepared->execute($value);
này sẽ ném lỗi "null value violates not-null constraint
"
là một workaround tạm thời, tôi c heck nếu $value
trống và thay đổi thành " "
(một không gian), nhưng đó là một hack khủng khiếp và có thể gây ra các vấn đề khác.
Làm cách nào để chèn các chuỗi trống với các câu lệnh đã chuẩn bị sẵn sàng, mà không cần cố gắng để chèn một NULL?
CHỈNH SỬA: Quá lớn của một dự án đi qua toàn bộ codebase của tôi, tìm ở mọi nơi sử dụng chuỗi trống "" và thay đổi nó để sử dụng NULL thay thế. Những gì tôi cần biết là tại sao các truy vấn MySQL chuẩn xử lý "" và NULL là hai thứ riêng biệt (như tôi nghĩ là đúng), nhưng các câu lệnh chuẩn bị chuyển đổi "" thành NULL.
Lưu ý rằng "" và NULL là không phải là điều tương tự. Ví dụ: SELECT NULL = "";
trả về NULL
thay vì 1
như bạn mong muốn.
Nếu bạn đang chèn "", mà là cơ bản null, tại sao không thay đổi lĩnh vực này trong db để cho phép null. – UnkwnTech
nó "về cơ bản là vô giá trị" trong cùng một cách mà 0 là "về cơ bản" sai. chúng tương tự nhưng thực sự khá khác nhau. – nickf
NULL có nghĩa là "không có giá trị" không, "chuỗi rỗng" – warren