Data Truncated Errors

Published on May 6, 2009, 3:03 p.m.

I recently ran into some of the Data truncated for column ... errors in my django apps. After a little digging, I've discovered that my particular problem lie in the structure of the underlying MySQL tables. Particularly with varchar columns.

I have a model that contains a FileField:
class MyModel(models.Model):
file = models.FileField(upload_to="files/%Y/%m/%d")


Note that the MySQL table generated by this model will look something like the following:
+-------------+--------------+------+-----+---------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------------------+----------------+
| id | int(11) | | PRI | NULL | auto_increment |
| file | varchar(100) | | | | |
+-------------+--------------+------+-----+---------------------+----------------+


See the varchar(100)! If you're users are uploading files with long names (mine are!), this may not be enough! Note that my model also has an upload_to that includes a year, month, and day. That's already 17 characters...

So when someone tries to upload a file named:
Who_Said_One_Hundred_Characters_Would_Ever_Be_Enough_For_A_REALLY_LONG_Filename_draft_one_.docx


It will get pre-pended with '/files/2009/05/06/', and what gets stored in your table?
files/2009/05/06/Who_Said_One_Hundred_Characters_Would_Ever_Be_Enough_For_A_REALLY_LONG_Filename_draft_one_.docx


That's 112 characters... and it won't work!

The solution?
You could alter your table so that the file column is a varchar(255)... which may help.
alter table myapp_mymodel modify file varchar(255);


OR, use shorter filenames!

Good Luck!
comments powered by Disqus