2009-11-09 19 views
22

Tôi đang tạo ứng dụng PHP/MySQL và tôi đang gặp sự cố với truy vấn tạo và cập nhật của mình. Tôi có 5 cột được đặt thành loại FLOAT cũng được thiết lập như các cột NULL Tôi không có kế hoạch điền chúng vào cho đến sau này trong tiến trình công việcLỗi này là gì? "Truy vấn cơ sở dữ liệu không thành công: Dữ liệu bị cắt bớt cho cột 'column_name' tại hàng 1

Tuy nhiên, tôi cần tạo bản ghi mới cho cơ sở dữ liệu này. Tôi đang sử dụng OOP PHP sử dụng phương thức save() tiêu chuẩn để kiểm tra xem ID có tồn tại trong đối tượng hay không. Nếu không, nó gọi create() và nếu có, nó sẽ gọi là update(). tốt, thường là

Các phương thức update()create() được thiết kế để lấy từ một mảng thuộc tính protected static $db_fields được khai báo ở đầu mỗi Lớp, chứa tất cả các trường được sử dụng trong bảng đó. update()create() chạy qua mảng đó và INSERT INTO hoặc UPDATE trong SQL, tương ứng.

Hiểu biết của tôi là nếu bạn sử dụng '' (hai dấu nháy đơn, trống), SQL sẽ bỏ qua các yêu cầu INSERT INTO hoặc UPDATE và để chúng là NULL. Thậm chí không có các trường biểu mẫu cho 5 giá trị float đó ở bất kỳ đâu trên trang, do đó, tất nhiên khi các phương thức chạy, các giá trị sẽ là ''.

Đó có phải là lý do tôi nhận được lỗi "Cắt dữ liệu" không? Có vẻ như khác - tôi chưa từng thấy lỗi cắt ngắn trước đây và đó là lý do tại sao tôi đến với các thiên tài của bạn. Cảm ơn.

+0

Linh cảm của tôi là MySQL kỳ vọng các giá trị được ghi vào trường FLOAT ít nhất là số hoặc NULL. Bạn đã thử sử dụng NULL thay vì ''? – jkndrkn

Trả lời

29

''null không giống nhau. nếu máy chủ mysql của bạn ở chế độ nghiêm ngặt, thì nó sẽ từ chối thực hiện việc chèn vì bạn đã chuyển dữ liệu không hợp lệ cho cột. mà không có chế độ nghiêm ngặt, nó sẽ trả về một cảnh báo.

mysql> create table a (a float not null); 
Query OK, 0 rows affected (0.11 sec) 

mysql> insert a values (''); 
Query OK, 1 row affected, 1 warning (0.05 sec) 

mysql> show warnings; 
+---------+------+----------------------------------------+ 
| Level | Code | Message        | 
+---------+------+----------------------------------------+ 
| Warning | 1265 | Data truncated for column 'a' at row 1 | 
+---------+------+----------------------------------------+ 
1 row in set (0.00 sec) 

mysql> set sql_mode = 'STRICT_ALL_TABLES'; 
Query OK, 0 rows affected (0.02 sec) 

mysql> insert a values (''); 
ERROR 1265 (01000): Data truncated for column 'a' at row 1 

hoặc chèn rõ ràng null s hoặc thậm chí không chỉ định cột trong chèn.

khi bạn cập nhật, bạn có thể gửi tất cả các giá trị bạn có vì mysql sẽ tự động bỏ qua những giá trị không thay đổi.

+0

Có, tôi có thể thấy tôi cần phải làm điều đó. Nhưng với UPDATE nó không thể thực sự đúng, bởi vì bạn thường có một biểu mẫu có tất cả các cột của bản ghi nhưng bạn chỉ cập nhật một hoặc hai, và ứng dụng không biết cái nào đã được thay đổi để nó cập nhật tất cả, v.v. Điều tôi quan tâm là - lỗi TRUNCATED đến từ đâu? – rhodesjason

+0

xem ví dụ được cập nhật của tôi. lỗi truncate là mysql cho bạn biết rằng nó không thể chuyển đổi chuỗi có độ dài bằng không bạn đã chuyển nó thành một giá trị số thích hợp. – longneck

+0

Được rồi, đây là những gì tôi cần nghe - đó chỉ là vấn đề trong quá trình chèn và không phải trong quá trình cập nhật. Tôi đã lo lắng! Cảm ơn. – rhodesjason

1

Nếu bạn không định INSERT dữ liệu, nó sẽ không nằm trong câu lệnh SQL.

Ví dụ: giả sử bạn có bảng "Dữ liệu" có id, float1, float2, float3 và float4, Float5, trong đó bạn sẽ chỉ thêm ID. INSERT sẽ trông như thế này:

INSERT INTO `Data` (`id`) 
VALUES ('Some-ID-Value') 

Nếu nổi được định nghĩa để chấp nhận NULL họ sẽ được cài đặt sẵn để NULL. Cũng vậy với các câu lệnh UPDATE, bạn chỉ nên liệt kê các trường mà bạn sẽ thay đổi.

1

Điều này không có nghĩa là một giải pháp, nhưng chỉ để có thể làm sáng tỏ thêm một số vấn đề.

Nếu bạn thêm từ khóa IGNORE vào câu lệnh và cố chèn '' (hoặc bất kỳ chuỗi nào không bắt đầu bằng số) vào cột nổi, MySQL sẽ chèn giá trị 0, thay vì giá trị mặc định.

INSERT IGNORE INTO a_table (float_column) VALUE ('') 

INSERT IGNORE INTO a_table (float_column) VALUE ('abc') 

Cả hai đều sẽ chèn 0, ngay cả khi giá trị mặc định là rỗng. Nếu không có IGNORE, tất nhiên, cả hai câu lệnh sẽ làm tăng lỗi bạn đang thấy.

Tóm lại, bạn nhận được thông báo vì dữ liệu bạn đang cung cấp không phải là loại dự kiến ​​cũng như giá trị mặc định.

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