It's stored procedure support is very nice, and allows you to write procedures in the built in PGPSQL. However, if that syntax doesn't sit well with you, you can also write them in Tcl, or Perl, or PHP, or Ruby, or Java, or...you get the idea. Our ERP's stored procedures are all written in Java, for the record.
The stability has been incredible...the community support, wonderful.
And it's really, really free, to boot.
I haven't really faced a lot of the problems others have with MySQL, but that's probably because for the applications that have mattered, I've always gone back to PostgreSQL. And the whole commercial/non-commercial licensing FUD MySQL AB historically spread about when you actually had to buy a license just left a bad taste in my mouth. I'm ok with buying licenses and am happy to, but don't enjoy or
appreciate that need being fabricated by sales staff.
(and I think it's already in the Alpha)
For more information, see the development-version documentation:
There were already plenty of technical justifications to abandon MySQL, but the potential of dealing with Oracle sealed the business case. From past experience, Oracle was not a company whose licensing, development, or business strategy we wanted to be beholden to.
With Oracle now (nearly) owning MySQL proper, the move seems correct. There's the potential that they'll improve on MySQL, but any significant improvements will eat at Oracle sales unless they're also countered with licensing changes or other revenue-boosting strategies -- such as splitting into enterprise/open source open/closed versions.
Better to use PostgreSQL where we don't need to pay client library licensing fees, and aren't locked to a vendor.
You also had the option of using the very old public domain licensed version of the client library, provided you could find it. I believe that RedHat shipped it at one point.
It hasn't shown any advantage over MySQL in the tests done so far beyond not belonging to Oracle.
And for new projects, I do prefer PostgreSQL.
Except for some engines you can choose from.
- You have to choose engines
- Some features (e.g. ACID Transactions) don't work in some engines.
I'm not sure exactly why this is a feature.
In PostgreSQL (and in most sane DB software)
- You don't have to choose engines
- All features work all the time. There's no posiblity of foolery like, say, beginning a transaction and then updating two tables, then finding that one of the tables will ignore the transaction but the other won't.
That's the key. Even features which you may not need in particular scenario will add their overhead.
What if you don't need transactions in PG?
Let's not forget MySQL has engines like MEMORY, ARCHIVE, BLACKHOLE (not to mention third party engines).
I was trying to forget about MySQL and it's plethora of engines.
Meanwhile, MySQL, which I had running for various third-party products like Wordpress, required some maintenance here and then, corrupted on-disk table files (and indexes), produced invalid dumps that were not restorable (and no warnings about that fact) and annoyed me with the inferior command line tool (better by now).
One thing I wish PostgreSQL would add is to set a collation order on a specific index. Right now, in one of my applications, I can't rely on Postgres doing the sorting, forcing me to retrieve all rows and sort on the client side which is a) annoying and b) anything but fast.
But whereas earlier, we had to set LC_COLLATE at initdb-time, now we can do it at createdb time and who knows - maybe we can do it at create index time in the future? I certainly lack the skill to contribute this particular feature.
Postgres, keep getting things right, please.
All databases need backups, but I don't trust MySQL not to need the restores too.
What I'd try is to feed the MySQL schema into postgres (after removing the awful ` quotes around field names) and see what happens.
In cases where postgres doesn't accept the MySQL schema dump, you will have to manually check what you are doing and fix it manually anyways (the exception being auto_increment which you can fix with an easy search and replace process).
Stuff like that "timestamp not null default '0000-00-00'" comes to mind for example. I wouldn't know whether I would drop the invalid default or both the not null and the invalid default - that pretty much depends on the application.