Почему PHP PDO DSN отличается от MySQL для PostgreSQL?

Когда я подключаюсь к базе данных MySQL с использованием PDO, мне нужно подключиться следующим образом:

$pdoConnection = new PDO("mysql:host=hostname;dbname=databasename",user,password); 

Но для PostgreSQL DSN является более стандартным (IMO):

 $pdoConnection = new PDO("pgsql:host=hostname;dbname=databasename;user=username;password=thepassword"); 

Есть ли причина, по которой MySQL не может использовать одну строку? Или это только из-за версий, которые я использую (PHP 5.2, MySQL 5.0, PostgreSQL 8.1)?

Как человек, который реализовал оба варианта, могу сказать вам, что причина заключается в том, что, передавая строку через as-to postgres (и ODBC), код драйвера PDO для этих баз данных не нуждается в обновлении, поскольку базовая библиотека добавляет новые функции ,

Так как MySQL не имеет собственного кода синтаксического анализа строки, мы изобрели механизм передачи данных в базовые вызовы функций MySQL, которые имеют очень специфический API с фиксированными параметрами.

Не случайно; это очень преднамеренно.

Да, это несоответствие API является серьезным раздражением.

В процессе работы я собираю фактическую строку DSN с необязательным именем пользователя и паролем с использованием синтаксиса строки запроса – затем анализируйте и создайте так:

 parse_str($connection_string, $params); $pdo = new PDO($params['dsn'], @$params['username'], @$params['password']); 

Итак, для PostgreSQL используйте $connection_string как:

 dsn=pgsql:host=localhost;dbname=test;user=root;password=root 

А для MySQL используйте строку типа:

 dsn=mysql:host=localhost;dbname=testdb&username=root&password=root 

Вид хромой, но он прост и работает.

Это просто случайность, что человек, который реализовал соединитель mysql, сделал это иначе, чем тот, кто реализовал разъем pgsql.