django / MySQL 4.1 : bogus "Data truncated for column" error

23 June 2008

I was importing a bunch of posts, setting the text body directly to my posts

post.body = maintext

Trying to save them got an error "Data truncated for column..." which makes no sense because the body is a TextField which is a MySQL longtext type.

Hours later ....

(remember kids, always google FIRST, then try to solve it yourself. this way humanity can quickly evolve past these boring problems and go onto greater endeavors.)

Its this django ticket:
http://code.djangoproject.com/ticket/4336

which is "won't fix" because it isn't django but rather MySQL having a problem with the charsets. The post I was trying to add had UTF8 content. Its the django error message that is misleading.

Solution: switch the default charset for the database before you run syncdb. I'm using CocoaMySQL and it won't do that. Log in to the MySQL monitor (the terminal/interactive):

mysql -uUSERNAME -p
(enter password at next prompt ...)

alter database djcrucial CHARACTER SET = utf8;

Then run syncdb and subsequent tables will be created with UTF8

remember there is a difference between:
1. the char set of the connection that you are using
2. the default char set of the database (eg. 'crucial')
3. the char set of each table (set to db's default charset unless you load in tables from SQL that explicitly set it like: DEFAULT CHARSET = latin)

the char set of the connection should be set to UTF8
django seems like it connects using whatever the db is set to.

you can also edit (or create) a my.cnf file so that all future created databases will use UTF8 by default


  • more posts in tech notes
    • django.db.utils.DatabaseError: relation "django_content_type" does not exist

      p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco} I was getting an error while running unit tests and the test database was failing to be created.django.db.utils.DatabaseError: relation "django_content_type" does not existeventually found the problem.  I had the following in a file that was imported to a models.py:hrd_type = ContentType.objects.get_for_model(HttpReferrerDomain)The idea being that it can just set the var when it loads up and after that its always there.  But this means for creating a fresh database, the db is ...

    • django has two classes called ValidationError

      There is one in django.core.exceptions and one in django.forms.util Using that space age IDE Eclipse I have to say I'm enjoying how much time I've saved just going shift-command-O to organize and resolve all of my imports.  But today I've just lost a few hours due to my ok-ing the wrong class. Quite mysterious it was, I raised a ValidationError (core exceptions one) in my form's clean() and watched as the try: except ValidationError: in django's full_clean() completely ignored my ...

    • GDAL fails to build: `.rodata' can not be used when making a shared object; recompile with -fPIC

        libtool: link: g++ -shared -nostdlib /usr/lib/gcc/x86_64-linux-gnu/4.4.1/../../../../lib/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.4.1/crtbeginS.o .libs/libgdal.la.lnkscript  -L/usr/local/lib /usr/local/lib/libgeos_c.so /usr/local/lib/libgeos.so /usr/local/lib/libexpat.so -L/usr/lib -lpq -lrt -ldl /usr/lib/libcurl.so -lssl -lcrypto -lz -L/usr/lib/gcc/x86_64-linux-gnu/4.4.1 -L/usr/lib/gcc/x86_64-linux-gnu/4.4.1/../../../../lib -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.4.1/../../.. -lstdc++ -lm -lc -lgcc_s /usr/lib/gcc/x86_64-linux-gnu/4.4.1/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/4.4.1/../../../../lib/crtn.o         -Wl,-soname -Wl,libgdal.so.1 -o .libs/libgdal.so.1.13.2 /usr/bin/ld: /usr/local/lib/libz.a(crc32.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC /usr/local/lib/libz.a: could not read symbols: Bad value collect2: ld returned 1 exit status make[1]: *** [libgdal.la] Error 1 make[1]: Leaving directory `/home/crucial/tmp/gdal-1.6.2' ...

    • installing MySQLdb on Ubuntu (mysql-python)

      MySQLdb is the python support bindings for MySQL.  Not that the name would lead you to beleive that. Its sourceforge page calls it http://sourceforge.net/projects/mysql-python/ which makes more sense. you need setuptools, which you usually already have:     sudo aptitude install python-setuptools You need MySQL-devel to compile, but its not called that, its called: libmysql++-dev on Ubuntu     sudo apt-get install libmysql++-dev download MySQLdb itself from:     http://sourceforge.net/projects/mysql-python/     # the version you download will be more recent     tar xfz ...

    • Full index for tech notes
Backwardation : Version 12"
coltan and cassiterite Timeblind : Solar Life Raft Ingredients