Date formats in MySQL are a pain, but you just have to read the documentation. Start with php.net search for function date.
On the other hand, one simple answer is to avoid the MySQL date stuff (apart from anything else, it is interpreted as local time on the server, which for me is in a funny foreign country, which doesn't even have a simple fixed conversion to GMT). Here's a sample table which I found when I checked how I do it:
CODE
// +--------+-------------+------+-----+---------+-------+
// | Field | Type | Null | Key | Default | Extra |
// +--------+-------------+------+-----+---------+-------+
// | ocode | int(4) | | PRI | 0 | | order number
// | src | varchar(10) | YES | | NULL | | supplier ('Epoch' etc.)
// | status | varchar(4) | YES | | NULL | | open, pend(ing), canc(elled), sent, recd
// | yyyy | int(4) | YES | | NULL | | ) date created
// | mm | int(2) | YES | | NULL | | )
// | avail | int(8) | | | NULL | | expected delivery date
// +--------+-------------+------+-----+---------+-------+
You still sort by date, using the YYYY, MM, DD fields separately. It also means you can use your own conventions for things like 'vague dates': I have an "expected" value for ordered stock, which can be a date, or things like 'mid-July 2011'. You don't lose much by not using the MySQL date functions.