PostgreSQL is generally considered the heavy lifter in the Open Source database arena.
While MySQL is optimized for simple selects and a few users, and is a very good choice for things like content management, a lack of constraints, triggers, stored procs, user defined functions and very poor input data checking make it unsuitable for most accounting type applications.
Take a look at the case studies one the web site:
http://advocacy.postgresql.org/casestudies/
PostgreSQL is the backend database for things like the .org and .info tlds, and is used by the govt for many large databases like geological surveys and such.
It's primary power is that while it is fairly fast for a single user, it stays fast under even very heavy load, comparatively speaking.
PHP support postgresql just fine, I've been developing PHP apps on top of PostgreSQL for about 5 years now, with nary a blip. more and more projects that once support only or mainly MySQL are now supporting PostgreSQL and, to a lesser extent, FirebirdSQL.
This one:
http://sourceforge.net/projects/phpwiki/ now fully supports postgresql (the adodb stuff is in CVS, but the PEAR and SQL access classes work as is.) And PHPBB also supports postgresql.
I had a friend as me which to use, MySQL or PostgreSQL for an accounting app, and I showed his this:
PostgreSQL:
=> create table test (i1 int, n1 numeric(500,10),v1 varchar(20));
CREATE TABLE
=> insert into test values (NULL,100000000000000000000000000000000000000000.0000000,NULL);
INSERT 21432532 1
=> insert into test values (10000000000000000000000000000,NULL,NULL);
ERROR: integer out of range
=> insert into test values (NULL,NULL,'abcdefghijklmnopqrstuvwxyz');
ERROR: value too long for type character varying(20)
=> select * from test;
i1 | n1 | v1
----+-------------------------------------------------------+----
| 100000000000000000000000000000000000000000.0000000000 |
(1 row)
MySQL:
mysql> create table test (i1 int, n1 numeric(245,10),v1 varchar(20));
Query OK, 0 rows affected (0.00 sec)
mysql> insert into test values (NULL,100000000000000000000000000000000000000000.0000000,NULL);
Query OK, 1 row affected (0.00 sec)
mysql> insert into test values (1000000000000000000000,NULL,NULL);
Query OK, 1 row affected (0.00 sec)
mysql> insert into test values (NULL,NULL,'abcdefghijklmnopqrstuvwxyz');
Query OK, 1 row affected (0.00 sec)
mysql> select * from test;
+------------+-------------------------------------------------------+----------------------+
| i1 | n1 | v1 |
+------------+-------------------------------------------------------+----------------------+
| NULL | 100000000000000000620008645040778319495168.0000000000 | NULL |
| 2147483647 | NULL | NULL |
| NULL | NULL | abcdefghijklmnopqrst |
+------------+-------------------------------------------------------+----------------------+
3 rows in set (0.08 sec)
Note that at no time does MySQL error out, even when the answer is obvious. And I don't know about you, but I'm pretty sure that I didn't insert the same value in n1 that I got back in MySQL with nary an error. Note it just truncated my text with no warning or notice.
While this behavious is fine for a database backending a simple content management system, it is wholly unacceptable for one that is being used for things like payroll or medical dosage or anything that has to be right or people could go hungry, lost their house, or worse.